From 9a347dd70e4a9c115a1c590f1eb30b9942823fe0 Mon Sep 17 00:00:00 2001 From: Sunghyun Kwon Date: Fri, 10 Apr 2015 11:23:03 +0900 Subject: [PATCH] Initialize the gmime for upstream Change-Id: I0de898dce379c3dcbccafec51f17dbb920142bfb --- AUTHORS | 1 + COPYING | 504 + ChangeLog | 9113 ++++++++ INSTALL | 370 + Makefile.am | 43 + Makefile.in | 893 + NEWS | 0 PORTING | 247 + README | 188 + TODO | 109 + acinclude.m4 | 177 + aclocal.m4 | 11749 ++++++++++ build/Makefile.am | 3 + build/Makefile.in | 623 + build/vs2008/Makefile.am | 18 + build/vs2008/Makefile.in | 440 + build/vs2008/basic-example.vcproj | 359 + build/vs2008/config-win32.h | 193 + build/vs2008/config-win32.h.in | 193 + build/vs2008/gmime.sln | 169 + build/vs2008/gmime.vcproj | 807 + build/vs2008/imap-example.vcproj | 359 + build/vs2008/test-cat.vcproj | 367 + build/vs2008/test-headers.vcproj | 367 + build/vs2008/test-iconv.vcproj | 367 + build/vs2008/test-mbox.vcproj | 367 + build/vs2008/test-mime.vcproj | 367 + build/vs2008/test-streams.vcproj | 367 + build/vs2008/unistd.h | 21 + build/vs2008/uudecode.vcproj | 375 + build/vs2008/uuencode.vcproj | 375 + build/vs2010/Makefile.am | 18 + build/vs2010/Makefile.in | 440 + build/vs2010/basic-example.vcxproj | 206 + build/vs2010/config-win32.h | 193 + build/vs2010/config-win32.h.in | 193 + build/vs2010/gmime.sln | 139 + build/vs2010/gmime.vcxproj | 331 + build/vs2010/imap-example.vcxproj | 206 + build/vs2010/test-cat.vcxproj | 210 + build/vs2010/test-headers.vcxproj | 210 + build/vs2010/test-iconv.vcxproj | 210 + build/vs2010/test-mbox.vcxproj | 210 + build/vs2010/test-mime.vcxproj | 210 + build/vs2010/test-streams.vcxproj | 210 + build/vs2010/unistd.h | 21 + build/vs2010/uudecode.vcxproj | 215 + build/vs2010/uuencode.vcxproj | 217 + config.guess | 1530 ++ config.h.in | 213 + config.rpath | 0 config.sub | 1773 ++ configure | 21779 +++++++++++++++++++ configure.ac | 663 + depcomp | 688 + docs/Makefile.am | 5 + docs/Makefile.in | 624 + docs/gtkdocs_fix | 11 + docs/reference/Makefile.am | 83 + docs/reference/Makefile.in | 767 + docs/reference/building.sgml | 280 + docs/reference/changes-2.0.sgml | 136 + docs/reference/changes-2.2.sgml | 80 + docs/reference/changes-2.4.sgml | 57 + docs/reference/changes-2.6.sgml | 65 + docs/reference/compiling.sgml | 46 + docs/reference/data-wrappers.sgml | 22 + docs/reference/filters.sgml | 53 + docs/reference/gmime-docs.sgml | 261 + docs/reference/gmime-overrides.txt | 0 docs/reference/gmime-sections.txt | 1362 ++ docs/reference/gmime.hierarchy | 49 + docs/reference/html/CryptoContexts.html | 47 + docs/reference/html/DataWrappers.html | 33 + docs/reference/html/Filters.html | 71 + docs/reference/html/GMimeCertificate.html | 1160 + docs/reference/html/GMimeContentDisposition.html | 338 + docs/reference/html/GMimeContentType.html | 389 + docs/reference/html/GMimeCryptoContext.html | 959 + docs/reference/html/GMimeDataWrapper.html | 263 + docs/reference/html/GMimeFilter.html | 303 + docs/reference/html/GMimeFilterBasic.html | 113 + docs/reference/html/GMimeFilterBest.html | 203 + docs/reference/html/GMimeFilterCRLF.html | 121 + docs/reference/html/GMimeFilterCharset.html | 108 + docs/reference/html/GMimeFilterEnriched.html | 116 + docs/reference/html/GMimeFilterFrom.html | 149 + docs/reference/html/GMimeFilterGZip.html | 139 + docs/reference/html/GMimeFilterHTML.html | 192 + docs/reference/html/GMimeFilterMd5.html | 122 + docs/reference/html/GMimeFilterStrip.html | 100 + docs/reference/html/GMimeFilterWindows.html | 160 + docs/reference/html/GMimeFilterYenc.html | 498 + docs/reference/html/GMimeGpgContext.html | 264 + docs/reference/html/GMimeMessage.html | 624 + docs/reference/html/GMimeMessagePart.html | 181 + docs/reference/html/GMimeMessagePartial.html | 253 + docs/reference/html/GMimeMultipart.html | 600 + docs/reference/html/GMimeMultipartEncrypted.html | 226 + docs/reference/html/GMimeMultipartSigned.html | 196 + docs/reference/html/GMimeObject.html | 831 + docs/reference/html/GMimeParser.html | 597 + docs/reference/html/GMimePart.html | 514 + docs/reference/html/GMimePkcs7Context.html | 158 + docs/reference/html/GMimeSignature.html | 754 + docs/reference/html/GMimeStream.html | 631 + docs/reference/html/GMimeStreamBuffer.html | 214 + docs/reference/html/GMimeStreamCat.html | 128 + docs/reference/html/GMimeStreamFile.html | 206 + docs/reference/html/GMimeStreamFilter.html | 170 + docs/reference/html/GMimeStreamFs.html | 195 + docs/reference/html/GMimeStreamMem.html | 259 + docs/reference/html/GMimeStreamMmap.html | 166 + docs/reference/html/GMimeStreamNull.html | 102 + docs/reference/html/GMimeStreamPipe.html | 159 + docs/reference/html/Headers.html | 44 + docs/reference/html/InternetAddress.html | 163 + docs/reference/html/InternetAddressGroup.html | 187 + docs/reference/html/InternetAddressList.html | 526 + docs/reference/html/InternetAddressMailbox.html | 160 + docs/reference/html/InternetAddresses.html | 44 + docs/reference/html/MimeParts.html | 59 + docs/reference/html/Parsers.html | 33 + docs/reference/html/Streams.html | 62 + docs/reference/html/ch01.html | 75 + docs/reference/html/classes.html | 197 + docs/reference/html/core.html | 53 + docs/reference/html/fundamentals.html | 44 + docs/reference/html/gmime-GMimeHeader.html | 956 + docs/reference/html/gmime-GMimeParam.html | 325 + docs/reference/html/gmime-GMimePartIter.html | 388 + docs/reference/html/gmime-building.html | 284 + docs/reference/html/gmime-changes-2-0.html | 135 + docs/reference/html/gmime-changes-2-2.html | 91 + docs/reference/html/gmime-changes-2-4.html | 82 + docs/reference/html/gmime-changes-2-6.html | 90 + docs/reference/html/gmime-compiling.html | 70 + docs/reference/html/gmime-data-wrappers.html | 46 + docs/reference/html/gmime-filters.html | 72 + docs/reference/html/gmime-gmime-charset.html | 465 + docs/reference/html/gmime-gmime-encodings.html | 992 + docs/reference/html/gmime-gmime-iconv-utils.html | 229 + docs/reference/html/gmime-gmime-iconv.html | 258 + docs/reference/html/gmime-gmime-utils.html | 642 + docs/reference/html/gmime-gmime.html | 261 + docs/reference/html/gmime-question-index.html | 132 + docs/reference/html/gmime-resources.html | 82 + docs/reference/html/gmime-streams.html | 90 + docs/reference/html/gmime.devhelp2 | 738 + docs/reference/html/gmime.html | 93 + docs/reference/html/home.png | Bin 0 -> 578 bytes docs/reference/html/index.html | 296 + docs/reference/html/index.sgml | 949 + docs/reference/html/left.png | Bin 0 -> 373 bytes docs/reference/html/right.png | Bin 0 -> 380 bytes docs/reference/html/style.css | 266 + docs/reference/html/up.png | Bin 0 -> 291 bytes docs/reference/question_index.sgml | 81 + docs/reference/resources.sgml | 57 + docs/reference/streams.sgml | 73 + docs/reference/tmpl/gmime-certificate.sgml | 390 + docs/reference/tmpl/gmime-charset.sgml | 184 + docs/reference/tmpl/gmime-cipher-context.sgml | 569 + docs/reference/tmpl/gmime-content-type.sgml | 141 + docs/reference/tmpl/gmime-crypto-context.sgml | 286 + docs/reference/tmpl/gmime-data-wrapper.sgml | 93 + docs/reference/tmpl/gmime-disposition.sgml | 126 + docs/reference/tmpl/gmime-encodings.sgml | 297 + docs/reference/tmpl/gmime-error.sgml | 37 + docs/reference/tmpl/gmime-filter-basic.sgml | 38 + docs/reference/tmpl/gmime-filter-best.sgml | 64 + docs/reference/tmpl/gmime-filter-charset.sgml | 38 + docs/reference/tmpl/gmime-filter-crlf.sgml | 38 + docs/reference/tmpl/gmime-filter-enriched.sgml | 44 + docs/reference/tmpl/gmime-filter-from.sgml | 46 + docs/reference/tmpl/gmime-filter-gzip.sgml | 46 + docs/reference/tmpl/gmime-filter-html.sgml | 94 + docs/reference/tmpl/gmime-filter-md5.sgml | 46 + docs/reference/tmpl/gmime-filter-strip.sgml | 37 + docs/reference/tmpl/gmime-filter-windows.sgml | 55 + docs/reference/tmpl/gmime-filter-yenc.sgml | 186 + docs/reference/tmpl/gmime-filter.sgml | 93 + docs/reference/tmpl/gmime-gpg-context.sgml | 92 + docs/reference/tmpl/gmime-header.sgml | 337 + docs/reference/tmpl/gmime-iconv-utils.sgml | 81 + docs/reference/tmpl/gmime-iconv.sgml | 69 + docs/reference/tmpl/gmime-message-part.sgml | 65 + docs/reference/tmpl/gmime-message-partial.sgml | 87 + docs/reference/tmpl/gmime-message.sgml | 223 + docs/reference/tmpl/gmime-multipart-encrypted.sgml | 65 + docs/reference/tmpl/gmime-multipart-signed.sgml | 62 + docs/reference/tmpl/gmime-multipart.sgml | 217 + docs/reference/tmpl/gmime-object.sgml | 275 + docs/reference/tmpl/gmime-param.sgml | 116 + docs/reference/tmpl/gmime-parser.sgml | 204 + docs/reference/tmpl/gmime-part-iter.sgml | 145 + docs/reference/tmpl/gmime-part.sgml | 192 + docs/reference/tmpl/gmime-pkcs7-context.sgml | 55 + docs/reference/tmpl/gmime-session-simple.sgml | 52 + docs/reference/tmpl/gmime-session.sgml | 57 + docs/reference/tmpl/gmime-signature.sgml | 260 + docs/reference/tmpl/gmime-stream-buffer.sgml | 67 + docs/reference/tmpl/gmime-stream-cat.sgml | 47 + docs/reference/tmpl/gmime-stream-file.sgml | 66 + docs/reference/tmpl/gmime-stream-filter.sgml | 56 + docs/reference/tmpl/gmime-stream-fs.sgml | 66 + docs/reference/tmpl/gmime-stream-gio.sgml | 72 + docs/reference/tmpl/gmime-stream-mem.sgml | 92 + docs/reference/tmpl/gmime-stream-mmap.sgml | 52 + docs/reference/tmpl/gmime-stream-null.sgml | 37 + docs/reference/tmpl/gmime-stream-pipe.sgml | 55 + docs/reference/tmpl/gmime-stream.sgml | 205 + docs/reference/tmpl/gmime-unused.sgml | 1182 + docs/reference/tmpl/gmime-utils.sgml | 240 + docs/reference/tmpl/gmime.sgml | 131 + docs/reference/tmpl/internet-address-group.sgml | 65 + docs/reference/tmpl/internet-address-list.sgml | 180 + docs/reference/tmpl/internet-address-mailbox.sgml | 56 + docs/reference/tmpl/internet-address.sgml | 56 + docs/reference/tree_index.sgml | 45 + docs/tutorial/Makefile.am | 24 + docs/tutorial/Makefile.in | 438 + docs/tutorial/gmime-tut.sgml | 681 + gmime.pc.in | 13 + gmime.spec | 109 + gmime.spec.in | 109 + gmime/Makefile.am | 170 + gmime/Makefile.in | 1030 + gmime/charset-map.c | 283 + gmime/gen-table.c | 212 + gmime/gmime-certificate.c | 840 + gmime/gmime-certificate.h | 244 + gmime/gmime-charset-map-private.h | 9500 ++++++++ gmime/gmime-charset.c | 947 + gmime/gmime-charset.h | 77 + gmime/gmime-common.c | 86 + gmime/gmime-common.h | 37 + gmime/gmime-content-type.c | 447 + gmime/gmime-content-type.h | 93 + gmime/gmime-crypto-context.c | 750 + gmime/gmime-crypto-context.h | 234 + gmime/gmime-data-wrapper.c | 281 + gmime/gmime-data-wrapper.h | 83 + gmime/gmime-disposition.c | 346 + gmime/gmime-disposition.h | 104 + gmime/gmime-encodings.c | 1124 + gmime/gmime-encodings.h | 189 + gmime/gmime-error.h | 71 + gmime/gmime-events.c | 220 + gmime/gmime-events.h | 46 + gmime/gmime-filter-basic.c | 256 + gmime/gmime-filter-basic.h | 64 + gmime/gmime-filter-best.c | 332 + gmime/gmime-filter-best.h | 116 + gmime/gmime-filter-charset.c | 320 + gmime/gmime-filter-charset.h | 69 + gmime/gmime-filter-crlf.c | 240 + gmime/gmime-filter-crlf.h | 73 + gmime/gmime-filter-enriched.c | 611 + gmime/gmime-filter-enriched.h | 76 + gmime/gmime-filter-from.c | 268 + gmime/gmime-filter-from.h | 82 + gmime/gmime-filter-gzip.c | 524 + gmime/gmime-filter-gzip.h | 83 + gmime/gmime-filter-html.c | 493 + gmime/gmime-filter-html.h | 140 + gmime/gmime-filter-md5.c | 182 + gmime/gmime-filter-md5.h | 66 + gmime/gmime-filter-strip.c | 184 + gmime/gmime-filter-strip.h | 62 + gmime/gmime-filter-windows.c | 233 + gmime/gmime-filter-windows.h | 73 + gmime/gmime-filter-yenc.c | 607 + gmime/gmime-filter-yenc.h | 174 + gmime/gmime-filter.c | 344 + gmime/gmime-filter.h | 113 + gmime/gmime-gpg-context.c | 2319 ++ gmime/gmime-gpg-context.h | 78 + gmime/gmime-header.c | 1035 + gmime/gmime-header.h | 133 + gmime/gmime-iconv-utils.c | 306 + gmime/gmime-iconv-utils.h | 43 + gmime/gmime-iconv.c | 360 + gmime/gmime-iconv.h | 105 + gmime/gmime-message-part.c | 227 + gmime/gmime-message-part.h | 71 + gmime/gmime-message-partial.c | 495 + gmime/gmime-message-partial.h | 81 + gmime/gmime-message.c | 1622 ++ gmime/gmime-message.h | 133 + gmime/gmime-multipart-encrypted.c | 405 + gmime/gmime-multipart-encrypted.h | 81 + gmime/gmime-multipart-signed.c | 473 + gmime/gmime-multipart-signed.h | 77 + gmime/gmime-multipart.c | 870 + gmime/gmime-multipart.h | 120 + gmime/gmime-object.c | 1089 + gmime/gmime-object.h | 142 + gmime/gmime-param.c | 1002 + gmime/gmime-param.h | 63 + gmime/gmime-parse-utils.c | 310 + gmime/gmime-parse-utils.h | 40 + gmime/gmime-parser.c | 2079 ++ gmime/gmime-parser.h | 118 + gmime/gmime-part-iter.c | 594 + gmime/gmime-part-iter.h | 58 + gmime/gmime-part.c | 898 + gmime/gmime-part.h | 107 + gmime/gmime-pkcs7-context.c | 957 + gmime/gmime-pkcs7-context.h | 68 + gmime/gmime-signature.c | 636 + gmime/gmime-signature.h | 174 + gmime/gmime-stream-buffer.c | 843 + gmime/gmime-stream-buffer.h | 95 + gmime/gmime-stream-cat.c | 730 + gmime/gmime-stream-cat.h | 69 + gmime/gmime-stream-file.c | 455 + gmime/gmime-stream-file.h | 72 + gmime/gmime-stream-filter.c | 499 + gmime/gmime-stream-filter.h | 71 + gmime/gmime-stream-fs.c | 500 + gmime/gmime-stream-fs.h | 72 + gmime/gmime-stream-gio.c | 720 + gmime/gmime-stream-gio.h | 79 + gmime/gmime-stream-mem.c | 483 + gmime/gmime-stream-mem.h | 75 + gmime/gmime-stream-mmap.c | 468 + gmime/gmime-stream-mmap.h | 74 + gmime/gmime-stream-null.c | 254 + gmime/gmime-stream-null.h | 67 + gmime/gmime-stream-pipe.c | 343 + gmime/gmime-stream-pipe.h | 71 + gmime/gmime-stream.c | 606 + gmime/gmime-stream.h | 139 + gmime/gmime-table-private.h | 71 + gmime/gmime-utils.c | 2845 +++ gmime/gmime-utils.h | 89 + gmime/gmime-version.h | 76 + gmime/gmime-version.h.in | 76 + gmime/gmime.c | 211 + gmime/gmime.h | 131 + gmime/internet-address.c | 1590 ++ gmime/internet-address.h | 206 + gtk-doc.make | 280 + iconv-detect.c | 184 + install-sh | 527 + ltmain.sh | 9661 ++++++++ m4/Makefile.am | 1 + m4/Makefile.in | 421 + m4/gtk-doc.m4 | 67 + m4/libtool.m4 | 8001 +++++++ m4/ltoptions.m4 | 384 + m4/ltsugar.m4 | 123 + m4/ltversion.m4 | 23 + m4/lt~obsolete.m4 | 98 + missing | 331 + mono/AssemblyInfo.cs.in | 4 + mono/CertificateCollection.custom | 243 + mono/DataWrapper.custom | 25 + mono/GMime.metadata | 367 + mono/Global.custom | 25 + mono/Header.cs | 21 + mono/HeaderEnumerator.cs | 113 + mono/HeaderList.custom | 56 + mono/InternetAddress.custom | 4 + mono/InternetAddressList.custom | 281 + mono/Makefile.am | 120 + mono/Makefile.in | 618 + mono/Message.custom | 87 + mono/Multipart.custom | 248 + mono/Object.custom | 8 + mono/SignatureCollection.custom | 243 + mono/Stream.custom | 4 + mono/StreamWrapper.cs | 187 + mono/gmime-api.raw | 3267 +++ mono/gmime-sharp.dll.config.in | 3 + mono/gmime-sharp.pc.in | 11 + mono/gmime-sharp.snk | Bin 0 -> 596 bytes mono/sources.xml | 9 + packaging/gmime.spec | 90 + tools/Makefile.am | 5 + tools/Makefile.in | 624 + tools/gmime-port-2-2-to-2-4.sh | 118 + tools/gmime-port-2-4-to-2-6.sh | 43 + util/Makefile.am | 24 + util/Makefile.in | 709 + util/cache.c | 128 + util/cache.h | 68 + util/gtrie.c | 511 + util/gtrie.h | 42 + util/list.c | 118 + util/list.h | 59 + util/md5-utils.c | 355 + util/md5-utils.h | 54 + util/url-scanner.c | 583 + util/url-scanner.h | 65 + zentimer.h | 189 + 397 files changed, 178643 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 NEWS create mode 100644 PORTING create mode 100644 README create mode 100644 TODO create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100644 build/Makefile.am create mode 100644 build/Makefile.in create mode 100644 build/vs2008/Makefile.am create mode 100644 build/vs2008/Makefile.in create mode 100644 build/vs2008/basic-example.vcproj create mode 100644 build/vs2008/config-win32.h create mode 100644 build/vs2008/config-win32.h.in create mode 100644 build/vs2008/gmime.sln create mode 100644 build/vs2008/gmime.vcproj create mode 100644 build/vs2008/imap-example.vcproj create mode 100644 build/vs2008/test-cat.vcproj create mode 100644 build/vs2008/test-headers.vcproj create mode 100644 build/vs2008/test-iconv.vcproj create mode 100644 build/vs2008/test-mbox.vcproj create mode 100644 build/vs2008/test-mime.vcproj create mode 100644 build/vs2008/test-streams.vcproj create mode 100644 build/vs2008/unistd.h create mode 100644 build/vs2008/uudecode.vcproj create mode 100644 build/vs2008/uuencode.vcproj create mode 100644 build/vs2010/Makefile.am create mode 100644 build/vs2010/Makefile.in create mode 100644 build/vs2010/basic-example.vcxproj create mode 100644 build/vs2010/config-win32.h create mode 100644 build/vs2010/config-win32.h.in create mode 100644 build/vs2010/gmime.sln create mode 100644 build/vs2010/gmime.vcxproj create mode 100644 build/vs2010/imap-example.vcxproj create mode 100644 build/vs2010/test-cat.vcxproj create mode 100644 build/vs2010/test-headers.vcxproj create mode 100644 build/vs2010/test-iconv.vcxproj create mode 100644 build/vs2010/test-mbox.vcxproj create mode 100644 build/vs2010/test-mime.vcxproj create mode 100644 build/vs2010/test-streams.vcxproj create mode 100644 build/vs2010/unistd.h create mode 100644 build/vs2010/uudecode.vcxproj create mode 100644 build/vs2010/uuencode.vcxproj create mode 100755 config.guess create mode 100644 config.h.in create mode 100644 config.rpath create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.ac create mode 100755 depcomp create mode 100644 docs/Makefile.am create mode 100644 docs/Makefile.in create mode 100755 docs/gtkdocs_fix create mode 100644 docs/reference/Makefile.am create mode 100644 docs/reference/Makefile.in create mode 100644 docs/reference/building.sgml create mode 100644 docs/reference/changes-2.0.sgml create mode 100644 docs/reference/changes-2.2.sgml create mode 100644 docs/reference/changes-2.4.sgml create mode 100644 docs/reference/changes-2.6.sgml create mode 100644 docs/reference/compiling.sgml create mode 100644 docs/reference/data-wrappers.sgml create mode 100644 docs/reference/filters.sgml create mode 100644 docs/reference/gmime-docs.sgml create mode 100644 docs/reference/gmime-overrides.txt create mode 100644 docs/reference/gmime-sections.txt create mode 100644 docs/reference/gmime.hierarchy create mode 100644 docs/reference/html/CryptoContexts.html create mode 100644 docs/reference/html/DataWrappers.html create mode 100644 docs/reference/html/Filters.html create mode 100644 docs/reference/html/GMimeCertificate.html create mode 100644 docs/reference/html/GMimeContentDisposition.html create mode 100644 docs/reference/html/GMimeContentType.html create mode 100644 docs/reference/html/GMimeCryptoContext.html create mode 100644 docs/reference/html/GMimeDataWrapper.html create mode 100644 docs/reference/html/GMimeFilter.html create mode 100644 docs/reference/html/GMimeFilterBasic.html create mode 100644 docs/reference/html/GMimeFilterBest.html create mode 100644 docs/reference/html/GMimeFilterCRLF.html create mode 100644 docs/reference/html/GMimeFilterCharset.html create mode 100644 docs/reference/html/GMimeFilterEnriched.html create mode 100644 docs/reference/html/GMimeFilterFrom.html create mode 100644 docs/reference/html/GMimeFilterGZip.html create mode 100644 docs/reference/html/GMimeFilterHTML.html create mode 100644 docs/reference/html/GMimeFilterMd5.html create mode 100644 docs/reference/html/GMimeFilterStrip.html create mode 100644 docs/reference/html/GMimeFilterWindows.html create mode 100644 docs/reference/html/GMimeFilterYenc.html create mode 100644 docs/reference/html/GMimeGpgContext.html create mode 100644 docs/reference/html/GMimeMessage.html create mode 100644 docs/reference/html/GMimeMessagePart.html create mode 100644 docs/reference/html/GMimeMessagePartial.html create mode 100644 docs/reference/html/GMimeMultipart.html create mode 100644 docs/reference/html/GMimeMultipartEncrypted.html create mode 100644 docs/reference/html/GMimeMultipartSigned.html create mode 100644 docs/reference/html/GMimeObject.html create mode 100644 docs/reference/html/GMimeParser.html create mode 100644 docs/reference/html/GMimePart.html create mode 100644 docs/reference/html/GMimePkcs7Context.html create mode 100644 docs/reference/html/GMimeSignature.html create mode 100644 docs/reference/html/GMimeStream.html create mode 100644 docs/reference/html/GMimeStreamBuffer.html create mode 100644 docs/reference/html/GMimeStreamCat.html create mode 100644 docs/reference/html/GMimeStreamFile.html create mode 100644 docs/reference/html/GMimeStreamFilter.html create mode 100644 docs/reference/html/GMimeStreamFs.html create mode 100644 docs/reference/html/GMimeStreamMem.html create mode 100644 docs/reference/html/GMimeStreamMmap.html create mode 100644 docs/reference/html/GMimeStreamNull.html create mode 100644 docs/reference/html/GMimeStreamPipe.html create mode 100644 docs/reference/html/Headers.html create mode 100644 docs/reference/html/InternetAddress.html create mode 100644 docs/reference/html/InternetAddressGroup.html create mode 100644 docs/reference/html/InternetAddressList.html create mode 100644 docs/reference/html/InternetAddressMailbox.html create mode 100644 docs/reference/html/InternetAddresses.html create mode 100644 docs/reference/html/MimeParts.html create mode 100644 docs/reference/html/Parsers.html create mode 100644 docs/reference/html/Streams.html create mode 100644 docs/reference/html/ch01.html create mode 100644 docs/reference/html/classes.html create mode 100644 docs/reference/html/core.html create mode 100644 docs/reference/html/fundamentals.html create mode 100644 docs/reference/html/gmime-GMimeHeader.html create mode 100644 docs/reference/html/gmime-GMimeParam.html create mode 100644 docs/reference/html/gmime-GMimePartIter.html create mode 100644 docs/reference/html/gmime-building.html create mode 100644 docs/reference/html/gmime-changes-2-0.html create mode 100644 docs/reference/html/gmime-changes-2-2.html create mode 100644 docs/reference/html/gmime-changes-2-4.html create mode 100644 docs/reference/html/gmime-changes-2-6.html create mode 100644 docs/reference/html/gmime-compiling.html create mode 100644 docs/reference/html/gmime-data-wrappers.html create mode 100644 docs/reference/html/gmime-filters.html create mode 100644 docs/reference/html/gmime-gmime-charset.html create mode 100644 docs/reference/html/gmime-gmime-encodings.html create mode 100644 docs/reference/html/gmime-gmime-iconv-utils.html create mode 100644 docs/reference/html/gmime-gmime-iconv.html create mode 100644 docs/reference/html/gmime-gmime-utils.html create mode 100644 docs/reference/html/gmime-gmime.html create mode 100644 docs/reference/html/gmime-question-index.html create mode 100644 docs/reference/html/gmime-resources.html create mode 100644 docs/reference/html/gmime-streams.html create mode 100644 docs/reference/html/gmime.devhelp2 create mode 100644 docs/reference/html/gmime.html create mode 100644 docs/reference/html/home.png create mode 100644 docs/reference/html/index.html create mode 100644 docs/reference/html/index.sgml create mode 100644 docs/reference/html/left.png create mode 100644 docs/reference/html/right.png create mode 100644 docs/reference/html/style.css create mode 100644 docs/reference/html/up.png create mode 100644 docs/reference/question_index.sgml create mode 100644 docs/reference/resources.sgml create mode 100644 docs/reference/streams.sgml create mode 100644 docs/reference/tmpl/gmime-certificate.sgml create mode 100644 docs/reference/tmpl/gmime-charset.sgml create mode 100644 docs/reference/tmpl/gmime-cipher-context.sgml create mode 100644 docs/reference/tmpl/gmime-content-type.sgml create mode 100644 docs/reference/tmpl/gmime-crypto-context.sgml create mode 100644 docs/reference/tmpl/gmime-data-wrapper.sgml create mode 100644 docs/reference/tmpl/gmime-disposition.sgml create mode 100644 docs/reference/tmpl/gmime-encodings.sgml create mode 100644 docs/reference/tmpl/gmime-error.sgml create mode 100644 docs/reference/tmpl/gmime-filter-basic.sgml create mode 100644 docs/reference/tmpl/gmime-filter-best.sgml create mode 100644 docs/reference/tmpl/gmime-filter-charset.sgml create mode 100644 docs/reference/tmpl/gmime-filter-crlf.sgml create mode 100644 docs/reference/tmpl/gmime-filter-enriched.sgml create mode 100644 docs/reference/tmpl/gmime-filter-from.sgml create mode 100644 docs/reference/tmpl/gmime-filter-gzip.sgml create mode 100644 docs/reference/tmpl/gmime-filter-html.sgml create mode 100644 docs/reference/tmpl/gmime-filter-md5.sgml create mode 100644 docs/reference/tmpl/gmime-filter-strip.sgml create mode 100644 docs/reference/tmpl/gmime-filter-windows.sgml create mode 100644 docs/reference/tmpl/gmime-filter-yenc.sgml create mode 100644 docs/reference/tmpl/gmime-filter.sgml create mode 100644 docs/reference/tmpl/gmime-gpg-context.sgml create mode 100644 docs/reference/tmpl/gmime-header.sgml create mode 100644 docs/reference/tmpl/gmime-iconv-utils.sgml create mode 100644 docs/reference/tmpl/gmime-iconv.sgml create mode 100644 docs/reference/tmpl/gmime-message-part.sgml create mode 100644 docs/reference/tmpl/gmime-message-partial.sgml create mode 100644 docs/reference/tmpl/gmime-message.sgml create mode 100644 docs/reference/tmpl/gmime-multipart-encrypted.sgml create mode 100644 docs/reference/tmpl/gmime-multipart-signed.sgml create mode 100644 docs/reference/tmpl/gmime-multipart.sgml create mode 100644 docs/reference/tmpl/gmime-object.sgml create mode 100644 docs/reference/tmpl/gmime-param.sgml create mode 100644 docs/reference/tmpl/gmime-parser.sgml create mode 100644 docs/reference/tmpl/gmime-part-iter.sgml create mode 100644 docs/reference/tmpl/gmime-part.sgml create mode 100644 docs/reference/tmpl/gmime-pkcs7-context.sgml create mode 100644 docs/reference/tmpl/gmime-session-simple.sgml create mode 100644 docs/reference/tmpl/gmime-session.sgml create mode 100644 docs/reference/tmpl/gmime-signature.sgml create mode 100644 docs/reference/tmpl/gmime-stream-buffer.sgml create mode 100644 docs/reference/tmpl/gmime-stream-cat.sgml create mode 100644 docs/reference/tmpl/gmime-stream-file.sgml create mode 100644 docs/reference/tmpl/gmime-stream-filter.sgml create mode 100644 docs/reference/tmpl/gmime-stream-fs.sgml create mode 100644 docs/reference/tmpl/gmime-stream-gio.sgml create mode 100644 docs/reference/tmpl/gmime-stream-mem.sgml create mode 100644 docs/reference/tmpl/gmime-stream-mmap.sgml create mode 100644 docs/reference/tmpl/gmime-stream-null.sgml create mode 100644 docs/reference/tmpl/gmime-stream-pipe.sgml create mode 100644 docs/reference/tmpl/gmime-stream.sgml create mode 100644 docs/reference/tmpl/gmime-unused.sgml create mode 100644 docs/reference/tmpl/gmime-utils.sgml create mode 100644 docs/reference/tmpl/gmime.sgml create mode 100644 docs/reference/tmpl/internet-address-group.sgml create mode 100644 docs/reference/tmpl/internet-address-list.sgml create mode 100644 docs/reference/tmpl/internet-address-mailbox.sgml create mode 100644 docs/reference/tmpl/internet-address.sgml create mode 100644 docs/reference/tree_index.sgml create mode 100644 docs/tutorial/Makefile.am create mode 100644 docs/tutorial/Makefile.in create mode 100644 docs/tutorial/gmime-tut.sgml create mode 100644 gmime.pc.in create mode 100644 gmime.spec create mode 100644 gmime.spec.in create mode 100644 gmime/Makefile.am create mode 100644 gmime/Makefile.in create mode 100644 gmime/charset-map.c create mode 100644 gmime/gen-table.c create mode 100644 gmime/gmime-certificate.c create mode 100644 gmime/gmime-certificate.h create mode 100644 gmime/gmime-charset-map-private.h create mode 100644 gmime/gmime-charset.c create mode 100644 gmime/gmime-charset.h create mode 100644 gmime/gmime-common.c create mode 100644 gmime/gmime-common.h create mode 100644 gmime/gmime-content-type.c create mode 100644 gmime/gmime-content-type.h create mode 100644 gmime/gmime-crypto-context.c create mode 100644 gmime/gmime-crypto-context.h create mode 100644 gmime/gmime-data-wrapper.c create mode 100644 gmime/gmime-data-wrapper.h create mode 100644 gmime/gmime-disposition.c create mode 100644 gmime/gmime-disposition.h create mode 100644 gmime/gmime-encodings.c create mode 100644 gmime/gmime-encodings.h create mode 100644 gmime/gmime-error.h create mode 100644 gmime/gmime-events.c create mode 100644 gmime/gmime-events.h create mode 100644 gmime/gmime-filter-basic.c create mode 100644 gmime/gmime-filter-basic.h create mode 100644 gmime/gmime-filter-best.c create mode 100644 gmime/gmime-filter-best.h create mode 100644 gmime/gmime-filter-charset.c create mode 100644 gmime/gmime-filter-charset.h create mode 100644 gmime/gmime-filter-crlf.c create mode 100644 gmime/gmime-filter-crlf.h create mode 100644 gmime/gmime-filter-enriched.c create mode 100644 gmime/gmime-filter-enriched.h create mode 100644 gmime/gmime-filter-from.c create mode 100644 gmime/gmime-filter-from.h create mode 100644 gmime/gmime-filter-gzip.c create mode 100644 gmime/gmime-filter-gzip.h create mode 100644 gmime/gmime-filter-html.c create mode 100644 gmime/gmime-filter-html.h create mode 100644 gmime/gmime-filter-md5.c create mode 100644 gmime/gmime-filter-md5.h create mode 100644 gmime/gmime-filter-strip.c create mode 100644 gmime/gmime-filter-strip.h create mode 100644 gmime/gmime-filter-windows.c create mode 100644 gmime/gmime-filter-windows.h create mode 100644 gmime/gmime-filter-yenc.c create mode 100644 gmime/gmime-filter-yenc.h create mode 100644 gmime/gmime-filter.c create mode 100644 gmime/gmime-filter.h create mode 100644 gmime/gmime-gpg-context.c create mode 100644 gmime/gmime-gpg-context.h create mode 100644 gmime/gmime-header.c create mode 100644 gmime/gmime-header.h create mode 100644 gmime/gmime-iconv-utils.c create mode 100644 gmime/gmime-iconv-utils.h create mode 100644 gmime/gmime-iconv.c create mode 100644 gmime/gmime-iconv.h create mode 100644 gmime/gmime-message-part.c create mode 100644 gmime/gmime-message-part.h create mode 100644 gmime/gmime-message-partial.c create mode 100644 gmime/gmime-message-partial.h create mode 100644 gmime/gmime-message.c create mode 100644 gmime/gmime-message.h create mode 100644 gmime/gmime-multipart-encrypted.c create mode 100644 gmime/gmime-multipart-encrypted.h create mode 100644 gmime/gmime-multipart-signed.c create mode 100644 gmime/gmime-multipart-signed.h create mode 100644 gmime/gmime-multipart.c create mode 100644 gmime/gmime-multipart.h create mode 100644 gmime/gmime-object.c create mode 100644 gmime/gmime-object.h create mode 100644 gmime/gmime-param.c create mode 100644 gmime/gmime-param.h create mode 100644 gmime/gmime-parse-utils.c create mode 100644 gmime/gmime-parse-utils.h create mode 100644 gmime/gmime-parser.c create mode 100644 gmime/gmime-parser.h create mode 100644 gmime/gmime-part-iter.c create mode 100644 gmime/gmime-part-iter.h create mode 100644 gmime/gmime-part.c create mode 100644 gmime/gmime-part.h create mode 100644 gmime/gmime-pkcs7-context.c create mode 100644 gmime/gmime-pkcs7-context.h create mode 100644 gmime/gmime-signature.c create mode 100644 gmime/gmime-signature.h create mode 100644 gmime/gmime-stream-buffer.c create mode 100644 gmime/gmime-stream-buffer.h create mode 100644 gmime/gmime-stream-cat.c create mode 100644 gmime/gmime-stream-cat.h create mode 100644 gmime/gmime-stream-file.c create mode 100644 gmime/gmime-stream-file.h create mode 100644 gmime/gmime-stream-filter.c create mode 100644 gmime/gmime-stream-filter.h create mode 100644 gmime/gmime-stream-fs.c create mode 100644 gmime/gmime-stream-fs.h create mode 100644 gmime/gmime-stream-gio.c create mode 100644 gmime/gmime-stream-gio.h create mode 100644 gmime/gmime-stream-mem.c create mode 100644 gmime/gmime-stream-mem.h create mode 100644 gmime/gmime-stream-mmap.c create mode 100644 gmime/gmime-stream-mmap.h create mode 100644 gmime/gmime-stream-null.c create mode 100644 gmime/gmime-stream-null.h create mode 100644 gmime/gmime-stream-pipe.c create mode 100644 gmime/gmime-stream-pipe.h create mode 100644 gmime/gmime-stream.c create mode 100644 gmime/gmime-stream.h create mode 100644 gmime/gmime-table-private.h create mode 100644 gmime/gmime-utils.c create mode 100644 gmime/gmime-utils.h create mode 100644 gmime/gmime-version.h create mode 100644 gmime/gmime-version.h.in create mode 100644 gmime/gmime.c create mode 100644 gmime/gmime.h create mode 100644 gmime/internet-address.c create mode 100644 gmime/internet-address.h create mode 100644 gtk-doc.make create mode 100644 iconv-detect.c create mode 100755 install-sh create mode 100644 ltmain.sh create mode 100644 m4/Makefile.am create mode 100644 m4/Makefile.in create mode 100644 m4/gtk-doc.m4 create mode 100644 m4/libtool.m4 create mode 100644 m4/ltoptions.m4 create mode 100644 m4/ltsugar.m4 create mode 100644 m4/ltversion.m4 create mode 100644 m4/lt~obsolete.m4 create mode 100755 missing create mode 100644 mono/AssemblyInfo.cs.in create mode 100644 mono/CertificateCollection.custom create mode 100644 mono/DataWrapper.custom create mode 100644 mono/GMime.metadata create mode 100644 mono/Global.custom create mode 100644 mono/Header.cs create mode 100644 mono/HeaderEnumerator.cs create mode 100644 mono/HeaderList.custom create mode 100644 mono/InternetAddress.custom create mode 100644 mono/InternetAddressList.custom create mode 100644 mono/Makefile.am create mode 100644 mono/Makefile.in create mode 100644 mono/Message.custom create mode 100644 mono/Multipart.custom create mode 100644 mono/Object.custom create mode 100644 mono/SignatureCollection.custom create mode 100644 mono/Stream.custom create mode 100644 mono/StreamWrapper.cs create mode 100644 mono/gmime-api.raw create mode 100644 mono/gmime-sharp.dll.config.in create mode 100644 mono/gmime-sharp.pc.in create mode 100644 mono/gmime-sharp.snk create mode 100644 mono/sources.xml create mode 100644 packaging/gmime.spec create mode 100644 tools/Makefile.am create mode 100644 tools/Makefile.in create mode 100755 tools/gmime-port-2-2-to-2-4.sh create mode 100755 tools/gmime-port-2-4-to-2-6.sh create mode 100644 util/Makefile.am create mode 100644 util/Makefile.in create mode 100644 util/cache.c create mode 100644 util/cache.h create mode 100644 util/gtrie.c create mode 100644 util/gtrie.h create mode 100644 util/list.c create mode 100644 util/list.h create mode 100644 util/md5-utils.c create mode 100644 util/md5-utils.h create mode 100644 util/url-scanner.c create mode 100644 util/url-scanner.h create mode 100644 zentimer.h diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..d652817 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Jeffrey Stedfast diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..5ab7695 --- /dev/null +++ b/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + 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 Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +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 other code 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. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + 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, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser 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 combine 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) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) 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. + + d) 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. + + e) 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 materials to be 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 with +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 Lesser 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. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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. + + , 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..9f21a34 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,9113 @@ +2015-01-23 Sunghyun Kwon + + * gmime/gmime-gpg-context.c (gpg_ctx_set_mode): Added the condition + (GPG_CTX_MODE_SIGN_ENCRYPT) + +2013-02-19 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.15 + +2013-02-19 Jeffrey Stedfast + + * gmime/gmime-filter-html.c (html_convert): Fixed to convert the + last line of input even if it doesn't end with a \n. + +2013-02-18 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.14 + +2013-02-18 Jeffrey Stedfast + + * util/url-scanner.c (url_addrspec_start): Fixed the logic to + actually scan for the beginning of the mailbox. + +2012-12-09 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.13 + +2012-11-26 Jeffrey Stedfast + + * gmime/gmime-header.c (g_mime_header_iter_first): Make sure the + list isn't empty. + (g_mime_header_iter_last): Same. + +2012-11-23 Jeffrey Stedfast + + * gmime/gmime-header.c (g_mime_header_list_prepend): Prepend the + header to the list, don't *append* it. Oops. + (g_mime_header_list_clear): Don't forget to reset the linked list + so that it doesn't contained free'd nodes. + +2012-11-02 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.12 + +2012-10-27 Jeffrey Stedfast + + * gmime/gmime-stream-filter.c (stream_read): Initialize presize to + READ_PAD instead of READ_SIZE to prevent potential buffer + underruns. + +2012-10-20 Jeffrey Stedfast + + * gmime/gmime-filter-gzip.c (gunzip_filter): Apparently + Z_BUF_ERROR isn't actually an error unless there is input + available. Thanks to Pavlo for this patch. + +2012-10-19 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_push_boundary): Don't use strcmp to + check if the boundary is an mbox boundary, use a direct pointer + comparison so that we can handle Content-Type boundary parameters + with a value of "From " + +2012-10-19 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_step_headers): Don't assume that + the first non-header line we find indicates the start of the + content unless we've already gotten some basic headers. + + Fix for bug #686223. + +2012-10-18 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.11 + +2012-09-12 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Unref the + certificate after adding it to the list (adding it to the list + refs it). + + * gmime/gmime-multipart-encrypted.c + (g_mime_multipart_encrypted_decrypt): If the 'result' out param is + null, unref the GMimeDecryptResult to avoid leaking. + +2012-08-13 Jeffrey Stedfast + + * gmime/gmime-utils.c (tokenize_rfc2047_phrase): Don't forget to + initialize 'ascii' to TRUE. + +2012-08-05 Jeffrey Stedfast + + * gmime/gmime-stream-pipe.c (stream_flush): Pipes and sockets + cannot be fsync()'d, so don't even try! + +2012-08-05 Jeffrey Stedfast + + * gmime/gmime-utils.c (rfc2047_token_new_encoded_word): Make sure + to properly handle broken encoded-word tokens in the form: + =?charset?q?=. + + Fixes the g_malloc abort() in bug #679388 + +2012-08-05 Jeffrey Stedfast + + * gmime/gmime-multipart-signed.c (check_protocol_supported): Oops, + need to compare against xsupported in the second string compare. + + Fixes bug #674032 + +2012-06-13 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.10 + +2012-06-13 Jeffrey Stedfast + + * gmime/Makefile.am: Always build gmime-gpg-context.[c,h] and + gmime-pkcs7-context.[c,h] + + * gmime/gmime-gpg-context.c: Armor internals with #ifdef + ENABLE_CRYPTOGRAPHY so that if crypto is disabled, only the + skeletal API is built. + + * gmime/gmime.h: Include gmime-pkcs7-context.h + + Fixes bug #676692. + +2012-06-13 Jeffrey Stedfast + + * gmime/gmime-utils.c (rfc2047_encode_get_rfc822_words): Use + is_blank() instead of is_lwsp() so that we only treat space and + tab as word delimiters (we want to rfc2047 encode \r's and + \n's). Check for ctrl characters when deciding what the type and + encoding of the word is. + +2012-06-13 Jeffrey Stedfast + + * gmime/gmime-utils.c (rfc2047_encode_get_rfc822_words): When + breaking up really long atom tokens, change the word type to + RFC2047 so that we encode them, thus preventing forced header + folding which cannot be unmunged. + (header_fold): Fixed for cases where the first word in a header is + 68 chars. (Note: this fix is largely unnecessary due to the above fix) + +2012-06-13 Jeffrey Stedfast + + * gmime/gmime-message.c: When setting a header, make sure to + always clear the header list cache of the toplevel mime_part as + well. + +2012-06-13 Jeffrey Stedfast + + * gmime/gmime-param.c (rfc2184_param_new): Only decode the charset + and lang if the parameter is actually encoded. Thanks to Peter + Bloomfield for this patch. + +2012-06-13 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Keep track of + DECRYPTION_OKAY status. + (gpg_decrypt): Only return NULL if decryption failed (e.g. we + didn't get a DECRYPTION_OKAY status). + + Fixes bug #677088. + +2012-06-13 Jeffrey Stedfast + + * docs/reference/building.sgml: Updated docs. + + Fixes bug #676341 + +2012-04-22 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.9 + +2012-04-22 Jeffrey Stedfast + + * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify): + Match protocols like application/x-pkcs7-signature, too. + + Fixes bug #674032. + +2012-04-19 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.8 + +2012-04-12 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_scan_headers): Make sure to + initialize 'start' before using it to calculate headers_end in the + case where parser_fill() failed. + + Fixes bug #673493. + +2012-03-10 Daniel Gillmor + + * mono/gmime-sharp.dll.config.in: Fixed missing .so number. + + Fixes bug #671785. + +2012-03-09 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.7 + +2012-03-09 Daniel Gillmor + + * gmime/gmime-certificate.h: Remove the trailing comma from the + last enum item to silence gcc -pedantic warnings. + + * gmime/gmime-message.h: Same. + +2012-03-09 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_step_headers): Be lenient with + "From " lines found in message headers. Fixes bug #671680. + +2012-02-20 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.6 + +2012-02-20 Jeffrey Stedfast + + * gmime/gmime-message.c (multipart_guess_body): Fixed + multipart/signed logic. + +2012-02-20 Jeffrey Stedfast + + * gmime/gmime-common.c (g_mime_strdup_trim): Optimized. + + * gmime/gmime-parser.c (header_parse): Use g_mime_strdup_trim() + instead of reimplementing the same logic here. + +2012-02-20 Jeffrey Stedfast + + * gmime/gmime-parser.c: Instead of filtering Content-* headers + inside GMimeObject subclasses, filter them in the parser. This way + header fetching works as expected in subparts which might have + non-standard headers (X-* and whatnot). + +2012-02-19 Jeffrey Stedfast + + * gmime/gmime-encodings.c (g_mime_content_encoding_from_string): + Match non-standard encodings: 7-bit, 8-bit, and x-uue (the + standard names for these are 7bit, 8bit, and x-uuencode). + +2012-02-19 Jeffrey Stedfast + + * gmime/gmime-common.c (g_mime_strdup_trim): New function that + optimizes g_strstrip combined with g_strdup in both speed and + memory usage (g_strstrip won't shrink the size of the dup'd + memory). + +2012-02-18 Jeffrey Stedfast + + * configure.ac: Add a --enable-smime flag which defaults to "no". + +2012-02-18 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.5 + +2012-02-18 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_scan_message_part): Make sure that + a boundary doesn't appear before we start scanning for the + headers. + +2012-02-18 Jeffrey Stedfast + + * src/uuencode.c: + * src/uudecode.c: Moved to examples/ + +2012-02-17 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_verify): In cases where gpg does + not exit with code 0, only set the GError when we've gotten no + signer information from gpg (otherwise we return the list of + signers, which will presumably include why the verification failed + in the status of each signer). Fixes bug #668085. + +2012-02-17 Jeffrey Stedfast + + * gmime/gmime-part-iter.c: Fixed to behave the same as IMAP and + also to actually work. + +2012-02-16 Jeffrey Stedfast + + * mono/Multipart.custom: Fixed the binding for Multipart.Count. + +2012-02-04 Jeffrey Stedfast + + * configure.ac: Added --with-gacdir to fix bug #667072 + +2012-01-11 Jeffrey Stedfast + + * mono/Makefile.am: Fixed up to more closely match the gtk-sharp + build. + + * mono/gmime-sharp.pc.in: Fixed to more closely match gtk-sharp. + +2012-01-11 Jeffrey Stedfast + + * gmime/gmime-pkcs7-context.c: Fixed some switch statements to + include a 'default' code path, fixing some compiler + warnings. Fixes bug #667684. + +2012-01-09 Ionut Biru + + * gmime/gmime-pkcs7-context.c: Fix compilation when S/MIME is not + enabled. + +2012-01-08 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.4 + +2012-01-08 Jeffrey Stedfast + + Fix for bug #667070 + + * configure.ac: Fixed Docbook checks for the html and pdf converters. + + * docs/tutorial/Makefile.am: Use the DB2HTML and DB2PDF variables. + +2012-01-05 Jeffrey Stedfast + + Fixes for bug #667137. + + * tests/Makefile.am: If any tests fail, exit with an error to + abort make. + + * tests/testsuite.c (testsuite_exit): Simply return + total_errors. + +2012-01-05 Jeffrey Stedfast + + Fixes for bug #667072. + + * mono/Makefile.am: Install to $(libdir) instead of $(prefix)/libdir. + + * mono/gmime-sharp.pc.in: Set libdir to @libdir@ + +2012-01-05 Jeffrey Stedfast + + * src/Makefile.am: Rename uuencode/uudecode to + gmime-uuencode/decode to prevent naming collisions with the GNU + Sharutils tools. Fixes bug #667073. + +2012-01-05 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Fixed returns + without a return value. Also fixed up some error-handling. + +2012-01-05 Jeffrey Stedfast + + * gmime/gmime-utils.c (rfc2047_decode_tokens): Fixed a memory leak. + +2011-12-23 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.3 + +2011-12-18 Jeffrey Stedfast + + * gmime/gmime-utils.c (quoted_decode): Made more robust and also + modified to keep state (e.g. for use when triplets span across + multiple encoded-word tokens). + (tokenize_rfc2047_phrase): Tokenizes a rfc822 phrase header for + later processing. + (tokenize_rfc2047_text): Tokenizes a rfc822 unstructured text + header for later processing. + (rfc2047_decode_tokens): Merge and decode rfc2047 tokens, + converting the decoded text into UTF-8. + (g_mime_utils_header_decode_phrase): Rewritten to use the above + functions. + (g_mime_utils_header_decode_text): Same. + +2011-12-18 Jeffrey Stedfast + + * gmime/gmime-utils.c (charset_convert): Don't count the + terminating nul character in the returned string length. + +2011-12-17 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.2 + +2011-12-15 Jeffrey Stedfast + + * gmime/gmime-iconv-utils.c (g_mime_iconv_strndup): Same. + + * gmime/gmime-filter-charset.c (flter_complete): Same as + charset_convert(). + + * gmime/gmime-utils.c (charset_convert): Make sure the output + buffer is large enough when flushing the conversion descriptor. + +2011-12-15 Jeffrey Stedfast + + * gmime/gmime.c (g_mime_init): Don't initialize the crypto types + unless crypto was enabled in the build. + +2011-11-06 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.1 + +2011-11-05 Jeffrey Stedfast + + * gmime/gmime-multipart-encrypted.c + (g_mime_multipart_encrypted_decrypt): Need to decode the content + of the application/octet-stream part containing the encrypted + payload as it may have a non-7bit Content-Transfer-Encoding. + +2011-11-05 Jeffrey Stedfast + + * gmime/gmime.c (g_mime_init): Register all GObject-based types + to prevent race conditions in multi-threaded apps. + +2011-08-27 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.6.0 + +2011-08-14 Jeffrey Stedfast + + * mono/*.custom: Simplified the GetEnumerator() implementations. + + * mono/HeaderEnumerator.cs: New IEnumerator class returned by + HeaderList.GetEnumerator(). Wraps HeaderIter, providing a more + C#-like experience. + +2011-08-14 Jeffrey Stedfast + + * mono/GMime.metadata: Rename AppendHeader() to Append(), + PrependHeader() to Prepend(), RemoveHeader() to Remove(), etc. + + * mono/HeaderList.custom: Instead of having + GetHeader()/SetHeader(), manually bind this as an indexer. + + * gmime/gmime-header.c (g_mime_header_list_clear): New function + to clear all headers. + (g_mime_header_list_contains): New function added mostly for + completeness in the C# binding. + +2011-08-14 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.5.10 + +2011-08-14 Jeffrey Stedfast + + * mono/GMime.metadata (PartBase): Rename to Entity to be more + consistent with MIME terminology and removed more convenience + methods that really only make sense in the C API. + (g_mime_object_new_type): Removed, there's no easy way to map this + to managed. + (g_mime_object_new): Removed, there's no easy way to map this + to managed. + +2011-08-14 Jeffrey Stedfast + + * gmime/gmime-part-iter.c: Updated to be more consistent with IMAP + part specifiers. + +2011-08-13 Jeffrey Stedfast + + * gmime/gmime-part-iter.c: New class for iterating over a tree of + GMimeObjects. Fixes bug #652012. + +2011-08-13 Jeffrey Stedfast + + * gmime/gmime-multipart.c (g_mime_multipart_replace): New + convenience function to replace a mime part at a specified + position. + +2011-08-08 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.5.9 + +2011-07-17 Jeffrey Stedfast + + * gmime/gmime-utils.c (charset_convert): Don't skip validation of + UTF-8 text. + +2011-07-17 Jeffrey Stedfast + + * gmime/gmime-utils.c (charset_convert): Handle ERANGE the same as + EILSEQ. + + * gmime/gmime-filter-charset.c (filter_filter): Handle ERANGE the + same as EILSEQ. + + * gmime/gmime-charset.c (g_mime_charset_map_init): Improved logic + for Win32 (and even Linux) systems. Don't rely on setlocale(). + +2011-06-15 Jeffrey Stedfast + + * gmime/gmime-parser.c: Added new state, MESSAGE_HEADERS, which + behaves the same as HEADERS but is only ever set when we are + parsing the toplevel GMimeMessage object. + (parser_step_headers): Be slightly more strict in handling + malformed headers in the MESSAGE_HEADERS state so that trying to + parse non-message streams fails (e.g. if someone tries to parse a + jpeg stream). + +2011-06-15 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c: Define nfds_t on OSX. + +2011-06-10 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.5.8 + +2011-06-09 Jeffrey Stedfast + + Fix for bug #652056 + + * gmime/gmime-param.c (decode_value): If STRICT_PARSER isn't + defined, don't require the value to start with a valid character. + +2011-06-08 Daniel Kahn Gillmor + + Fix for bug #651826 + + * gmime/gmime-gpg-context.c + (g_mime_gpg_context_[g,s]_set_use_agent): New functions to allow + the invoker to declare that they expect there to be a functioning + gpg-agent, and want gpg to talk to it for any needed credentials. + +2011-06-08 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c: If building on Apple, force the use + of our own implementation of poll() because Apple's poll() is + broken on some versions of MacOS. + +2011-03-18 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.5.7 + +2011-03-17 Jeffrey Stedfast + + * gmime/gmime-multipart-encrypted.c: Updated for crypto API + changes. + + * gmime/gmime-multipart-signed.c: Updated for crypto API changes. + + * gmime/gmime-crypto-context.c (g_mime_crypto_context_verify): Now + returns a GMimeSignatureList, the 'details' string was worthless + for GpgMe backend. + (GMimeDecryptResult): This is now a GObject. + + * gmime/gmime-pkcs7-context.c: Updated for crypto API changes. + + * gmime/gmime-gpg-context.c: Updated for crypto API changes. + + * gmime/gmime-certificate.[c,h]: New source files implementing + Certificate and CertificateList classes. + + * gmime/gmime-signature.[c,h]: New source files implementing + Signature and SignatureList classes. + +2011-03-16 Jeffrey Stedfast + + * mono/StreamWrapper.cs (Write): Implemented. + + * mono/CryptoRecipientCollection.cs: + * mono/SignerCollection.cs: New collections for Signers and + CryptoRecipients. + + * mono/SignatureValidity.custom: + * mono/DecryptionResult.custom: Don't return IEnumerators for + signers/recipients, return the appropriate Collections instead. + +2011-03-15 Jeffrey Stedfast + + * mono/SignatureValidity.custom: + * mono/DecryptionResult.custom: + * mono/CryptoRecipient.custom: + * mono/Signer.custom: New custom sources implementing enumerators + for Signers and Recipients. + +2011-03-14 Jeffrey Stedfast + + * configure.ac: Check for glib-sharp-2.0 instead of gtk-sharp-2.0 + since we really only depend on glib-sharp. Also check for gapi-2.0 + via pkgconfig. + +2011-03-07 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.5.6 + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Treat + EXPSIG, EXPKEYSIG, and REVKEYSIG the same as GOODSIG/BADSIG status + messages in that all of them denote a new signer info. + +2011-03-04 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.5.5 + +2011-03-04 Jeffrey Stedfast + + Implements features requested in bug #641841 and #641320. + + * gmime/gmime-crypto-context.h (GMimeCryptoHash): Reordered to be + identical to gnupg's listing. + (GMimeCryptoPubKeyAlgo): Same. + + * gmime/gmime-crypto-context.c (g_mime_decryption_result_[g,s]et_cipher): + New functions to get/set the cipher algorithm used. + (g_mime_decryption_result_[g,s]et_mdc): New functions to get/set + the mdc digest algorithm used. + + * gmime/gmime-gpg-context.c (gpg_hash_algo): Removed, no longer + needed. + (gpg_pubkey_algo): Same. + (gpg_ctx_parse_status) :Parse the DECRYPTION_INFO status to get + the cipher and mdc algorithms used. + (gpg_decrypt): Set the cipher and mdc values on the + GMimeDecryptionResult. + + * gmime/gmime-pkcs7-context.c (pkcs7_pubkey_algo): Removed, no + longer needed. + (pkcs7_hash_algo): Same. + +2011-03-04 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Make sure + to extract the pubkey_algo, hash_algo, sig_class, sig_expires, and + return-code values for ERRSIG. + +2011-03-04 Jeffrey Stedfast + + Implemented bug #641319. + + * gmime/gmime-crypto-context.c (g_mime_crypto_recipient_*): New + set of functions for manipulating a GMimeCryptoRecipient. + (g_mime_decryption_result_*): New set of functions to manipulate a + GMimeDecryptionResult + (g_mime_crypto_context_decrypt): Now returns a + GMimeDecryptionResult. + + * gmime/gmime-multipart-encrypted.c + (g_mime_multipart_encrypted_decrypt): Updated for API changes. + + * gmime/gmime-pkcs7-context.c (pkcs7_decrypt): Updated for API + changes. + + * gmime/gmime-gpg-context.c (gpg_decrypt): Updated for API + changes. + +2011-03-04 Jeffrey Stedfast + + API cleanup as well as preparing for the possibility of a + multi-protocol CryptoContext. + + * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt): + Updated to use new APIs for getting the encryption protocol. + (g_mime_multipart_encrypted_decrypt): Same. + + * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_sign): + Updated to use new APIs for getting the signature protocol. + (g_mime_multipart_signed_verify): Same. + + * gmime/gmime-crypto-context.c (g_mime_crypto_context_get_*_protocol): + New methods for getting the crypto protocol strings used by + multipart/encrypted and multipart/signed parts. + + * gmime/gmime-pkcs7-context.c (pkcs7_get_*_protocol): Implemented. + + * gmime/gmime-gpg-context.c (gpg_get_*_protocol): Implemented. + +2011-03-03 Jeffrey Stedfast + + * gmime/gmime-pkcs7-context.c (pkcs7_stream_seek): Added. + + * gmime/gmime.c (g_mime_init): Initialize gpgme. + +2011-02-08 Jeffrey Stedfast + + Implements feature request in bug #635663. + + * gmime/gmime-crypto-context.c (g_mime_signer_[g,s]et_sig_version): + New functions to access new signature version member. + (g_mime_signer_[g,s]et_sig_class): New functions to access new + signature class member. + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Extract + the signature class and version tokens. + +2011-02-08 Jeffrey Stedfast + + * PORTING: Updated docs. + + * mono/GMime.metadata: Fixed up for the new decrypt API. + + * gmime/gmime-message.c (multipart_guess_body): Updated. We can no + longer descend into the decrypted part because it is no longer + cached. + + * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_decrypt): + Now takes a GMimeSignatureValidity argument and no longer caches + the decrypted mime part/validity. + (g_mime_multipart_encrypted_get_signature_validity): Removed. + (g_mime_multipart_encrypted_encrypt): Don't cache the input part + as the decrypted part. + +2011-01-22 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Parse the + ERRSIG's return code, fixes bug #638605. + + * gmime/gmime-crypto-context.h: Added UNSUPP_ALGO error value. + +2011-01-22 Jeffrey Stedfast + + * gmime/gmime-stream-mem.c (stream_write): Correctly calculate the + end boundary of the stream when bound_end is -1. + +2010-12-05 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.5.4 + +2010-11-29 Jeffrey Stedfast + + * gmime/internet-address.c (decode_address): Handle edge cases + where inptr reaches the end of the input string prematurely due to + a malformed address. + +2010-11-29 Jeffrey Stedfast + + Fixes bug #635409. + + * gmime/gmime-pkcs7-context.c (pkcs7_get_validity): Reworked the + logic to calculate the signer status. Also dropped + GMimeSignatureStatus logic. + + * gmime/gmime-gpg-context.c (gpg_verify): Removed the (broken) + logic of calculating a GMimeSignatureStatus. + (gpg_decrypt): Same. + (gpg_ctx_parse_signer_info): Updated for the g_mime_signer_new() + API change. + + * gmime/gmime-crypto-context.c (g_mime_signature_validity_new): No + longer initializes a GMimeSignatureStatus member. + (g_mime_signature_validity_get_status): Removed. + (g_mime_signature_validity_set_status): Removed. + (g_mime_signer_new): Now takes a GMimeSignerStatus so that I could + get rid of the default NONE status. + + * gmime/gmime-crypto-context.h (GMimeSignatureStatus): Removed. + +2010-11-24 Jeffrey Stedfast + + Fixes bug #635661. + + * gmime/gmime-crypto-context.c (g_mime_signer_new): Initialize + pubkey_algo and hash_algo. + (g_mime_signer_[g,s]et_pubkey_algo): Implemented. + (g_mime_signer_[g,s]et_hash_algo): Renamed from [g,s]et_hash(). + + * gmime/gmime-crypto-context.h (GMimeCryptoPubKeyAlgo): Defined + enum. + + * gmime/gmime-pkcs7-context.c (pkcs7_get_validity): Record the + hash and pubkey algorithms used in the GMimeSigner. + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Record + the pubkey algorithm used by the signer. + +2010-11-22 Jeffrey Stedfast + + * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt): + Now takes a hash algorithm argument which it passes along to + g_mime_crypto_context_encrypt(). + + * gmime/gmime-gpg-context.c (gpg_ctx_get_argv): When signing and + encrypting, pass the digest algorithm to gpg on the command-line. + (gpg_encrypt): Set the hash id on the GpgCtx. + + * gmime/gmime-crypto-context.c (g_mime_crypto_context_encrypt): + Now takes a hash algorithm argument. + +2010-11-22 Jeffrey Stedfast + + Fixes bug #635492. + + * gmime/gmime-gpg-context.c (gpg_hash_from_id): New function + mapping the numeric hash id's that gpg uses to GMimeCryptoHash + ids. + (gpg_ctx_parse_signer_info): Extract the hash algorithm used by + the signer. + (gpg_ctx_parse_status): Updated to use gpg_hash_from_id(). + + * gmime/gmime-crypto-context.c (g_mime_signer_set_hash): New + function to set the hash algorithm used by the signer. + (g_mime_signer_get_hash): New function to get the hash algorithm + used by the signer. + +2010-11-22 Jeffrey Stedfast + + Fixes bug #635491. + + * gmime/gmime-crypto-context.[c,h]: Renamed from + gmime-cipher-context.[c,h]. + +2010-11-21 Jeffrey Stedfast + + Fixes bug #635407. + + * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_decrypt): + Updated error messages to be more consistent. + + * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify): + Make sure to set an error in all cases returning NULL. + +2010-11-21 Jeffrey Stedfast + + Fixes bug #635405. + + * gmime/gmime-cipher-context.c (g_mime_signer_get_*): These + functions all now take a const GMimeSigner *. + +2010-11-19 Jeffrey Stedfast + + Fixes bug #635152 + + * gmime/gmime-gpg-context.c (GpgCtx): No longer has a sigfile + member. Instead contains a sigstream and passwd_fd is now renamed + to secret_fd and used for both sending gpg the user's passwd as + well as for sending gpg the digital signature when verifying. + (gpg_ctx_new): Updated for the new struct members. + (gpg_ctx_set_sigstream): Replaces gpg_ctx_set_sigfile(). + (gpg_ctx_free): Updated for the new struct members. + (gpg_ctx_get_argv): Modify our --verify command-line so that we + can pas gpg the digital signature without first writing it to + disk. Also modified to return char** instead of a GPtrArray to + simplify things. + (gpg_ctx_op_start): Modified to also create more pipes in VERIFY + mode. + (gpg_ctx_op_step): Modified to stream the digital signature to + gpg. + (gpg_verify): Don't write the digital signature to disk - instead, + we now stream it directly to gpg. + +2010-10-30 Jeffrey Stedfast + + * gmime/gmime-message.c (g_mime_message_get_body): New function to + try and guess which part (or multipart/alternative) represents the + message body. + +2010-09-25 Jeffrey Stedfast + + * gmime/charset-map.c: According to rfc1557, it is suggested that + euc-kr be used for headers since many Korean mailers cannot handle + base64 or quoted-printable encoded iso-2022-kr. Based on this and + bug #629235, I'm just going to drop iso-2022-kr. + +2010-09-17 Jeffrey Stedfast + + Based on a patch by Marek Łętowski + + * gmime/gmime-utils.c (g_mime_utils_header_decode_text): In the + workaround case, if we don't find an end marker, reset our inptr + to the beginning of the most recent word *plus 2* (to skip over + the leading "=?"), not the beginning of the input text. Also need + to reset our ascii state. + (g_mime_utils_header_decode_phrase): In the workaround case, if we + don't find an end marker, reset our inptr to the beginning of the + most recent word *plus 2*, to skip over the leading "=?". + +2010-09-16 Jeffrey Stedfast + + * gmime/gmime-encodings.c (g_mime_encoding_quoted_encode_close): + If the last input character is not a \n, append an "=\n" sequence. + +2010-09-13 Jeffrey Stedfast + + * gmime/gmime-charset.c: Mark known_iconv_charsets[] as + static. Also mark string members of various private structs as + const. + +2010-09-06 Jeffrey Stedfast + + * configure.ac: Bump glib version requirement for + g_set_error_literal(). + +2010-09-02 Jeffrey Stedfast + + * gmime/internet-address.c (group_to_string): Don't crash if the + group name is unset. Thanks to Damian Pietras for this patch. + +2010-09-01 Jeffrey Stedfast + + * gmime/gmime-utils.c (g_mime_utils_header_decode_phrase): + Implement the same rfc2047-workaround hack as the one found in + g_mime_utils_header_decode_text(). + + * gmime/gmime-encodings.c (g_mime_encoding_base64_decode_step): + Need to keep state to keep track of the number of ='s we've backed + out over in case it crosses buffer boundaries. + +2010-08-30 Jeffrey Stedfast + + * gmime/gmime-param.c (decode_token): Make less strict in order to + handle unquoted boundary values containing '=' (and other illegal + characters). + +2010-08-26 Jeffrey Stedfast + + * gmime/internet-address.c (_internet_address_set_name): Don't + decode/unquote the name. The docs for all the functions that call + this assume the name string is in its decoded form already. + (_internet_address_decode_name): New internal function that + decodes a string and sets it as the name on the InternetAddress. + (decode_address): Rewritten to be even more liberal in what it + accepts. + +2010-06-20 Jeffrey Stedfast + + * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_decrypt): + Don't unref the encrypted content mime part object when the + content-type doesn't match application/octet-stream, + g_mime_multipart_get_part() does not ref parts it returns. We also + need to set an error when this happens. + +2010-05-18 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.5.3 + + * gmime/gmime-encodings.h (GMIME_QP_ENCODE_LEN): Since + force-wrapped lines use "=\n" instead of just "\n", lines will be + 74 bytes, not 73. + +2010-05-15 Jeffrey Stedfast + + * README: Bumped version + + * configure.ac: Bumped version to 2.5.2 + +2010-05-14 Jeffrey Stedfast + + * gmime/gmime-encodings.h (GMIME_QP_ENCODE_LEN): Fixed to take + into acount the possibility of having to force-wrap lines at 72+ + characters. + +2010-05-06 Jeffrey Stedfast + + * gmime/gmime-data-wrapper.c (g_mime_data_wrapper_get_stream): + Fixed documentation. + +2010-04-13 Jeffrey Stedfast + + * configure.ac: Added a --disable-cryptography flag to alloow + building without GnuPG or S/MIME support. Thanks to + pier11@operamail.com for this patch. Fixes bug #615343. + + * tests/test-streams.c: Use glib's G_GINT64_FORMAT and + G_GSIZE_FORMAT macros for our various *printf needs to be more + portable. Thanks to pier11@operamail.com for this patch. + + * gmime/gmime-gpg-context.c: Use g_set_error_literal() when no + printf-style arguments are needed. Fixes bug #615594. Thanks to + Tobias Mueller and Christian Persch. + + * Applied patch by pier11@operamail.com to fix the build for + MingW. Fixes bug #615068. + +2010-03-26 Jeffrey Stedfast + + Fixes for bug #613653 + + * gmime/gmime.c (g_mime_init): Initialize GMimeObject's type + registry. + (g_mime_shutdown): Shut it down here. + + * gmime/gmime-object.c (g_mime_object_type_registry_init): Renamed + a bit and fixed to not use g_atexit(). Also made internal-public. + (g_mime_object_type_registry_shutdown): Renamed and made + internal-public. Also set type_hash to NULL after destroying it so + that a re-init will work. + (g_mime_object_register_type): Don't init the type system anymore. + (g_mime_object_new): Same. + (g_mime_object_new_type): Same here. + +2010-03-26 Jeffrey Stedfast + + Fixes for bug #598855 + + * gmime/gmime-message.c (process_header): Return TRUE if we match + MIME-Version. + (message_prepend_header): Don't drop MIME-Version headers. + (message_append_header): Same. + (message_set_header): Here too. + (message_get_header): Only return the hard-coded "1.0" value for + MIME-Version if it is not set on the header object. + (message_remove_header): Allow the MIME-Version header to be + removed. + (message_get_headers): Only write our own MIME-Version header if + one isn't already set in the message headers. + (message_write_to_stream): Same here. + +2010-02-12 Jeffrey Stedfast + + Fixes bug #609700. + + * configure.ac: Define ENABLE_SMIME if we find GpgMe. + + * gmime/gmime-pkcs7-context.c: #ifdef out the GpgMe logic if we + are building without S/MIME support enabled. + +2010-02-07 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.5.1 + +2010-01-31 Jeffrey Stedfast + + * src/uudecode.c (uudecode): Just use fopen() to open fout instead + of using open() and then fdopen(). Fixes the code to work properly + on Windows. + + * gmime/gmime-encodings.h (GMIME_UUENCODE_LEN): Fixed to prevent + possible buffer overflows. + +2010-01-30 Jeffrey Stedfast + + * configure.ac: Disabled strict-aliasing to work around subtle + bugs generated by gcc 4.4 when optimizations are enabled. + +2010-01-30 Jeffrey Stedfast + + * gmime/gmime-iconv-utils.c (g_mime_iconv_strndup): Cleaned up the + code a bit. + +2010-01-17 Jeffrey Stedfast + + * gmime/gmime-filter-crlf.c (filter_filter): Fixed bug #606875 by + not trying to skip multiple characters per pass thru the loop when + encountering the first '.' of a possible '..' sequence. + +2010-01-12 Jeffrey Stedfast + + * gmime/gmime-utils.c (g_mime_utils_decode_8bit): Make sure to + always increment inptr as we force-convert it to ascii. Thanks to + Damian Pietras for finding this bug. + +2009-12-15 Jeffrey Stedfast + + * Released 2.5.0 - it's time to get this out there for people to + play with. + +2009-11-30 Jeffrey Stedfast + + * configure.ac: Don't include EXTRA_LIBS in GMIME_LIBS, instead + add it to GMIME_LIBS_PRIVATE so that things properly expand in the + .pc file. + + * gmime.pc.in: Moved -lz -lnsl, etc into Libs.private. Fixes bug + #603273. + +2009-11-05 Jeffrey Stedfast + + * gmime/gmime-multipart.c (ptr_array_insert): Fixed to handle an + index larger than the current array length as well as fixing the + true insert case to shift items when index is les than the current + array length (as opposed to when it is equal-to). Thanks to + harven@gingers.rulez.pl for finding this bug. + +2009-10-10 Jeffrey Stedfast + + * gmime/gmime-utils.c: Fixed the military timezone offsets. + + * gmime/gmime-encodings.c (g_mime_encoding_uudecode_step): Fixed a + uudecoding bug when uulen % 3 is 2. Thanks to Peter Hartley. Fixes + bug #597794. + +2009-10-01 Jeffrey Stedfast + + * gmime/gmime-part.c (mime_part_encode): Shortcut if the currently + set encoding is within the acceptable constraints. + + * docs/reference/gmime-sections.txt: Updated. + + * mono/gmime-api.raw: Updated. + +2009-10-01 Jeffrey Stedfast + + * gmime/gmime-filter-best.h: Moved GMimeEncodingConstraint to + gmime-encodings.h + + * gmime/gmime-object.c (g_mime_object_encode): New method to + calculate and set the best Content-Transfer-Encoding on a mime + part and its children. + + * gmime/gmime-part.c (mime_part_encode): Use a GMimeFilterBest to + make magic happen. + + * gmime/gmime-message.c (message_encode): Encode our toplevel mime + part object. + + * gmime/gmime-multipart.c (multipart_encode): Recurse over our + children and encode them. + + * gmime/gmime-multipart-signed.c (multipart_signed_encode): + Prevent our base class implementation from iterating over our + children. + +2009-09-30 Jeffrey Stedfast + + * build/vs2008/*: Made the Project/Solution tree much nicer. + + * gmime/gmime-stream-gio.c: various warning fixes. + (set_errno): Fixes to build on Windows. + (gio_seekable_bound_end): This needs to return gint64, not + ssize_t. + + * tests/test-streams.c: Use GDir instead of POSIX's dirent API and + also conditionally disable mmap tests. + + * tests/test-mbox.c: Use GDir instead of POSIX's dirent API to aid + in portability to Windows. + +2009-09-03 Jeffrey Stedfast + + * mono/gmime-sharp.dll.config.in: Simply target + libgmime-@GMIME_API_VERSION@.so since we are now properly + versioning libgmime-2.6.so + +2009-08-12 Jeffrey Stedfast + + * gmime/gmime-utils.c (charset_convert): If iconv() fails, treat + conditions where outleft == 0 the same as if we had gotten an + E2BIG error (e.g. we need to grow the output buffer) so that we + don't overrun it while appending a '?' placeholder character. + +2009-07-04 Jeffrey Stedfast + + * configure.ac: Check for GpgME needed for S/MIME support. + + * gmime/Makefile.am: Include gmime-pkcs7-context.[c,h] in the + build. + + * gmime/gmime-pkcs7-context.[c,h]: New source files implementing + the pkcs7 cipher context using GpgMe. + +2009-07-04 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_signer_info): Updated + for API changes to the GMimeSigner stuff. + + * gmime/gmime-cipher-context.c (g_mime_signer_new): Initialize the + newly added fields. + (g_mime_signer_free): Free the newly added fields. + (g_mime_signer_set_issuer_serial): New field accessor. + (g_mime_signer_get_issuer_serial): Same. + (g_mime_signer_set_issuer_name): Another new accessor. + (g_mime_signer_get_issuer_name): Same. + (g_mime_signer_set_email): And another... + (g_mime_signer_get_email): Same. + (g_mime_signer_set_sig_created): Renamed from + g_mime_signer_set_created(). + (g_mime_signer_get_sig_created): Renamed from + g_mime_signer_get_created(). + (g_mime_signer_set_sig_expires): Renamed from + g_mime_signer_set_expires(). + (g_mime_signer_get_sig_expires): Renamed from + g_mime_signer_get_expires(). + (g_mime_signer_set_key_created): New field accesor. + (g_mime_signer_get_key_created): Same. + (g_mime_signer_set_key_expires): Same. + (g_mime_signer_get_key_expires): Same. + +2009-07-02 Stanislav Brabec + + * configure.ac: Simplified configuring of gmime in a + cross-compilation environment. Make it possible to work-around + AC_TRY_RUN limitations by copying of target system iconv-detect.h + and setting ac_cv_have_iconv_detect_h=yes. + +2009-05-07 Jeffrey Stedfast + + * gmime/gmime-stream-fs.c (stream_read): Removed gross hack. + (stream_write): Same. + (g_mime_stream_fs_new): On Windows systems, set the translation + mode to BINARY. + (g_mime_stream_fs_new_with_bounds): Same. + + * gmime/gmime-stream-file.c: Same as GMimeStreamFs + +2009-05-02 Jeffrey Stedfast + + * gmime/gmime-stream-buffer.c (stream_seek_cache_read): Fixed a + 64bit cleanliness issue. + (stream_seek_cache_read): Cap the max cache size to G_MAXSIZE. + +2009-04-30 Jeffrey Stedfast + + * gmime/gmime-filter-best.h: Renamed GMimeBestEncoding to + GMimeEncodingConstraint to make this enum more clear as to what + it's intended purpose is. + + * gmime/gmime-part.c: Updated. + +2009-04-29 Sankar P + + * gmime.doap: Added new doap file to describe the project. + +2009-04-29 Jeffrey Stedfast + + * gmime/gmime-events.[c,h]: Don't require a GObject owner. + + * gmime/gmime-message.c (g_mime_message_set_mime_part): Add a + mime_part_headers_changed listener. + (g_mime_message_finalize): Remove the listener. + (mime_part_headers_changed): Uncache the message header stream. + (message_get_headers): Removed hack. + (message_write_to_stream): Same. + + * gmime/gmime-header.c (g_mime_header_list_set_stream): Emit a + changed event. + (g_mime_header_iter_set_value): Call set_stream() instead of + setting the stream to NULL ourselves. Also causes a changed event + to be emitted. + (g_mime_header_list_prepend): Same. + (g_mime_header_list_append): Here too. + (g_mime_header_list_set): And here. + (g_mime_header_list_remove): Same. + +2009-04-28 Jeffrey Stedfast + + * gmime/gmime-part.c (g_mime_part_get_best_content_encoding): New + helper function to calculate the most efficient + Content-Transfer-Encoding for a given mime-part. + +2009-04-28 Jeffrey Stedfast + + * build/vs2008/config-win32.h.in: No longer has GMIME_*_VERSION + defines - these are all in gmime-version.h now. + + * gmime/gmime-version.h.in: New template for generating + gmime-version.h + + * gmime/gmime.h: #include gmime-version.h + + * configure.ac: Renamed from configure.in. Now generates a + gmime/gmime-version.h header which contains a macro for checking + the GMime version at compile-time. Requested feature from the + Balsa guys. + +2009-04-26 Jeffrey Stedfast + + * tests/test-streams.c: Updated to test GIO streams. + + * gmime/gmime-stream-gio.c: New GMimeStream wrapper around GIO + streams. + +2009-04-26 Jeffrey Stedfast + + * gmime/gmime-session*.[c,h]: Removed. + + * gmime/gmime-stream-pipe.[c,h]: New stream for pipes (where + seeking isn't allowed). Needed by GMimeGpgContext. + + * gmime/gmime-gpg-context.c: Updated to use the new request_passwd + callback function instead of the GMimeSession. + (g_mime_gpg_context_set_auto_key_retrieve): New function for + disabling the auto-key-retrieve functionality of gpg. + (g_mime_gpg_context_get_auto_key_retrieve): New function to get + the state of auto-key-retrieve enabledness. + + * gmime/gmime-cipher-context.[c,h]: No longer references a + GMimeSession. Instead, we now have a GMimePasswordRequestFunc used + for prompting the user. + +2009-04-26 Jeffrey Stedfast + + * gmime/gmime-multipart-encrypted.c: Removed stub virtual method + overloads that did nothing but call the base class' + implementation. + + * gmime/gmime-multipart-signed.c: Same. + + * gmime/gmime-message-part.c (message_part_prepend_header): + Protect against setting Content-MD5 header since this is not + allowed. + (message_part_append_header): Same. + (message_part_get_header): Don't bother checking that the + requested header begins with "Content-", just pass it along to our + base class implementation to worry about. + (message_part_remove_header): Same. + + * gmime/gmime-message-partial.c (message_partial_get_header): + Same. + (message_partial_remove_header): Here too. + + * gmime/gmime-part.c (mime_part_remove_header): Same. + +2009-04-25 Jeffrey Stedfast + + * gmime/gmime-message-partial.c (g_mime_message_partial_split_message): + Fixed to use gint64 variables for stream length/offsets. + +2009-04-25 Jeffrey Stedfast + + * gmime/gmime-object.c (g_mime_object_set_disposition): Unref the + disposition after setting it on the GMimeObject, don't ref it + again. Oops. + + * gmime/gmime-message.c (to_list_changed, cc_list_changed): + (bcc_list_changed): Fixed callback signatures. Oops. + + * gmime/gmime-events.c: Fixed list traversal. What was I thinking + before? + +2009-04-25 Jeffrey Stedfast + + * gmime/gmime-parse-utils.h: Marked APIs as internal linkage only. + + * gmime/gmime-common.h: Same. + + * gmime/gmime-content-type.c: Use the new GMimeEvent API instead + of libgobject's g_signal API which is more than we need. + + * gmime/gmime-disposition.c: Same. + + * gmime/gmime-object.c: Updated to use the GMimeEvent API for + content-type and content-disposition. + + * gmime/internet-address.c: Use the new GMimeEvent API instead of + our own. + + * gmime/gmime-events.[c,h]: New source files implementing a simple + and performant event system needed internally within GMime. Based + on the event system that used to be in internet-address.c + +2009-04-24 Jeffrey Stedfast + + * gmime/gmime-parser.c (struct _GMimeParserPrivate): Added + message_headers_begin/end and changed the meaning of + headers_begin/end to be for the current MIME part rather than for + the current message itself. + (g_mime_parser_init): Init the boolean state variables before + calling parser_init() so that parser_init() can use them. + (parser_init): Only create a rawbuf if our stream isn't seekable + or isn't persistent. Initialize our new message_headers_begin/end. + (g_mime_parser_set_persist_stream): If our persist mode has + changed, malloc or free our rawbuf. + (raw_header_append): Don't append any data if rawbuf is NULL (this + means we're keeping track of offsets instead). + (parser_step_headers): Always update headers_begin/end since we + now always want to keep track of all header begin/end offsets. + (parser_step): Update our message_headers_begin/end state. + (parser_scan_message_part): Set the mime-part's raw header stream + on the message too. + (parser_construct_message): Same. + (parser_construct_leaf_part): Substream the input stream to get + our raw header stream to set on the mime-part's header-list. + (parser_construct_multipart): Same. + + * gmime/gmime-header.c (struct _GMimeHeaderList): Instead of + having a string buffer holding the raw header block content, + instead keep a stream. This not only makes it easy for us to keep + track of what the header offsets on disk are should the developer + want to know, but it also means we don't necessarily have to use + duplicate the header block to memory. + (g_mime_header_list_set_stream): New function that replaces the + old g_mime_header_list_set_raw() and looks much cleaner. + (g_mime_header_list_get_stream): New function to access said + stream. + + * gmime/gmime-message.c: Fixed uses of + g_mime_header_list_set/has_raw(). + (g_mime_message_set_mime_part): Set the message's raw header + stream to NULL. + + * gmime/gmime-multipart.c: Same. + + * tests/test-parser.c (test_parser): Updated. + +2009-04-24 Jeffrey Stedfast + + * build/vs2008/config-win32.h.in: New template to replace + config.h.win32 so that the version info gets autogenerated when I + make a new release. Makes it easier for me to keep it in sync. + + * build/vs2008/gmime.vcproj: No longer defines the gmime version + variables on the command-line (as these are now part of config.h). + +2009-04-23 Jeffrey Stedfast + + * branched: now begins 2.5.x development + + * configure.in: Updated. + + * zentimer.h: Updated to hopefully build on Windows. + + * gmime/Makefile.am: Rename lib name to gmime-2.6. + + * gmime.pc.in: Renamed from gmime-2.4.pc.in. + + * mono/gmime-sharp.pc.in: Renamed from gmime-sharp-2.4.pc.in. + + * gmime/gmime-stream*.[c,h] (stream_length): Fixed to return a gint64 + +2009-04-09 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.4.6 + +2009-04-05 Jeffrey Stedfast + + * gmime/gmime-encodings.c (g_mime_encoding_uudecode_step): Fixed a + bug wrt updating uulen when the data isn't an exact multiple of 3. + + * src/uuencode.c (uuencode): Don't bother dup()ing the stdout fd, just + use set_owner(FALSE) so that it doesn't close when we destroy the stream + instead. + + * gmime/gmime-stream-file.c (stream_read, stream_write): Don't depend on + simple arithmetic to update our stream->position on Windows since it + may do line-ending translation behind our backs. Call ftell() to get + our real position after reading or writing. + + * gmime/gmime-stream-fs.c (stream_read, stream_write): Same idea. + + * gmime/gmime-utils.c (mktime_utc): Fixed the Windows code-path. + (charset_convert): In the Windows case, fake the E2BIG error condition + if outleft <= inleft on any error as errno doesn't seem to get + properly set in this case. + + * tests/test-headers.c: Removed unused headers to fix the build on + Windows. + +2009-04-04 Jeffrey Stedfast + + * gmime/gmime-stream-fs.c: Ported to Windows by #including io.h + + * examples/basic-example.c: Reverted to the old GMimeStreamFs logic + and #included io.h for G_OS_WIN32 systems. + + * examples/imap-example.c: Ported to Windows by #including io.h and + using g_ascii_strcasecmp(). + +2009-04-03 Jeffrey Stedfast + + * build/vs2008: New directory for Visual Studio 2008 Solution & Project + files. + + * gmime.vcproj: Moved to build/vs2008 + + * config.h.win32: Same. + + * gmime.sln: Same. + + * examples/basic-example.c: Fixed to build under Visual Studio by + using GMimeStreamFile instead of GMimeStreamFs and by #ifdef'ing + out the GnuPG code. + + * tests/testsuit.[c,h]: Fixed to compile under Visual Studio which + basically means we can't use _try() as a function. Renamed to g_try(). + Also renamed throw() to g_throw() for consistency. + +2009-04-02 Jeffrey Stedfast + + * tests/testsuite.c: Modified to compile without the need for + pthread.h + + * gmime.vcproj: Added logic to the PreBuild step to copy + config.h.win32 to config.h + + * config.h.win32: Added. + +2009-04-01 Jeffrey Stedfast + + * gmime/gmime-utils.c: #include for getpid() and ws2tcpip.h + for getaddrinfo() on Windows platforms. + (mktime_utc): Use _get_timezone() when building on Windows. + (g_mime_utils_header_format_date): Windows has gmtime_s() instead + of gmtime_r(), so use that on Windows. + + * gmime/gmime-parser.c: If glib is >= 2.14, use GRegex instead of + glibc regex. + +2009-04-01 Jeffrey Stedfast + + * gmime/gmime-utils.c: Need to #include for getpid(). + + * gmime/gmime-stream-fs.c: Need to #include here. + + * gmime/gmime-multipart-signed.c: Got rid of an unused variable. + + * gmime/gmime-message.c: Removed unused variables. + + * gmime/gmime-content-type.c: Don't need to #include + "gmime-table-private.h" here as we don't actually use it. + + * util/gtrie.c: Disable g_warning()'s when compiled w/o + --enable-warnings and also fixed some compile warnings. + +2009-03-31 Jeffrey Stedfast + + * gmime.sln: New Microsoft Visual Studio 2008 Solution file for GMime. + + * gmime.vcproj: New Microsoft Visual C++ Project file for GMime. + +2009-03-31 Jeffrey Stedfast + + * gmime/gmime-utils.c: Removed unneeded #include + + * configure.in: Check for unistd.h + + * gmime/gmime-multipart.c (read_random_pool): Implement using + rand() in the case that unistd.h is not available. + + * gmime/gmime-parser.c (parser_scan_content): Fixed 'crlf' + argument to be a guint to make it easier to avoid compile warnings + about comparison between signed/unsigned ints in the callers. + + * gmime/internet-address.c (internet_address_group_add_member): + Fixed g_return macros to return a value. + (internet_address_mailbox_get_addr): Same. + +2009-03-30 Jeffrey Stedfast + + * configure.in: Check for regex.h + + * gmime/gmime-parser.c: #ifdef out the regex functionality if the + system does not have regex.h + + * gmime/gmime-stream-fs.h: Don't #include here. + + * gmime/gmime-stream.h: Removed #include as it isn't + needed there. + + * gmime/gmime-part.c: Removed unused includes. + + * gmime/gmime-utils.c: Only #include if we have + utsname.domainname. Helps build process on Windows. + +2009-03-29 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.4.5 + +2009-03-27 Jeffrey Stedfast + + * gmime/gmime-stream-buffer.c: Fixed to be more diligent in setting + errno on error. + + * gmime/gmime-stream-mmap.c: Fixed to be more diligent in setting + errno on error. + + * gmime/gmime-stream-mem.c: Fixed to be more diligent in setting + errno on error. + (stream_seek): If the user seeks beyond the end of the buffer and + bound_end is unbound, then grow the buffer (e.g. a sparse file). + + * gmime/gmime-stream-file.c: Fixed to be more diligent in setting + errno on error. + + * gmime/gmime-stream-fs.c: Fixed to be more diligent in setting + errno on error. + +2009-03-20 Jeffrey Stedfast + + * configure.in: Default --enable-largefile to yes. Looks like I + forgot to do this before rolling the version to 2.4.0 like I + intended. + + * tools/Makefile.am: Fixed to include the porting script in + EXTRA_DIST (instead of extra_DIST) so that the tarball includes + it, doh! + +2009-03-18 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.4.4 + +2009-03-18 Jeffrey Stedfast + + * configure.in: Check for select() and poll() as well as poll.h + + * gmime/gmime-gpg-context.c (poll): Implement our own poll() + function using select() for portability to MacOS 10.2, which + apparently doesn't have poll(). + +2009-02-22 Jeffrey Stedfast + + * gmime/gmime-utils.c: Use GSlice for rfc822 word tokens and date + tokens. + + * gmime/gmime-parser.c: Updated to use GSlice. + +2009-02-22 Jeffrey Stedfast + + * gmime/gmime-header.c (g_mime_header_iter_new): Use + g_slice_new(). + (g_mime_header_iter_free): Use g_slice_free(). + (g_mime_header_list_new): Use g_slice_new(). + (g_mime_header_list_destroy): Use g_slice_free(). + + * gmime/gmime-gpg-context.c (gpg_ctx_new): Use g_slice_new(). + (gpg_ctx_free): Use g_slice_free(). + + * gmime/gmime-cipher-context.c (g_mime_signer_new): Use + g_slice_new() instead of g_new(). + (g_mime_signature_validity_new): Same. + (g_mime_signature_validity_free): Use g_slice_free(). + (g_mime_signer_free): Same. + +2009-02-07 Jeffrey Stedfast + + * gmime/internet-address.c: Removed some unused macros. + +2009-01-12 Jeffrey Stedfast + + * mono/Makefile.am: Fixed to parallel make install, thanks to + Diego Pettenò. Fixes bug #567549. + +2009-01-09 Jeffrey Stedfast + + * examples/imap-example.c (write_part): Don't unref the stream we + get from g_mime_data_wrapper_get_stream(). + (reconstruct_part_content): Fixed error-checking. + +2008-11-01 Jeffrey Stedfast + + * gmime/gmime-parser.c (nearest_pow): Implement using asm on i386 + - this code path isn't normally built, but it's fun to + micro-optimize anyway ;-) + + * gmime/gmime-gpg-context.c (status_backup): Use next_alloc_size() + macro - same as gmime-parser.c + +2008-10-22 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.4.3 + +2008-10-22 Jeffrey Stedfast + + Fixes by Damian Pietras. + + * gmime/gmime-parser.c (check_boundary): Check that len > 0 before + checking for \r. + (header_parse): Fixed to handle headers with nothing but lwsp. + +2008-10-07 Jeffrey Stedfast + + * util/gtrie.c (g_trie_search): Instead of returning the first + match, find instead the best match starting at the same starting + offset (e.g. if we have two patterns "abc" and "abcdef" and the + input buffer is "abcdefghi", we want to match "abcdef" rather than + just "abc"). + (g_trie_quick_search): Renamed from the old g_trie_search(). + +2008-10-06 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.4.2 + +2008-10-02 Jeffrey Stedfast + + * gtk-doc.make: More parallel-install fixes so that devhelp + actually works. Patch to gtk-doc.make submitted upstream. + +2008-10-02 Jeffrey Stedfast + + Fixes for bug #554830 + + * mono/Makefile.am: Don't hard-code the API version. + + * mono/gmime-sharp-2.4.pc.in: Fixed incorrect path to include the + API_VERSION. + + * gmime-2.4.pc.in: Similar fixes. + + * configure.in: Define GMIME_API_VERSION + +2008-10-02 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.4.1 + +2008-10-02 Jeffrey Stedfast + + * gtk-doc.make: Allow for a versioned install of the + gtk-docs. Completes the fix for bug #554121. + + * docs/reference/Makefile.am: Define a DOC_MODULE_VERSION + + * mono/Makefile.am: Fix PACKAGE_SHARP to be versioned. Partial fix + for bug #554121. + + * gmime/gmime-parser.c: Made the headerbuf allocator a little less + liberal in the amount it allocates. + +2008-09-25 Jeffrey Stedfast + + * gmime/gmime-stream.c (stream_length): Implemented a default + solution using g_mime_stream_seek(). + +2008-09-25 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.4.0 + +2008-09-18 Jeffrey Stedfast + + * gmime/gmime-utils.c (g_mime_utils_header_decode_text): Check if + rfc2047-workarounds has been enabled at runtime. + + * gmime/gmime.h (GMIME_ENABLE_RFC2047_WORKAROUNDS): New + g_mime_init() flag so that a programmer can enable rfc2047 + workarounds at runtime. + + * gmime/gmime.c (g_mime_init): Save the init flags. + + * gmime/internet-address.c (internet_address_group_set_members): + Add an event listener to the new members, not the unref'd old + member list. Thanks to Peter Bloomfield for spotting this. + +2008-09-18 Jeffrey Stedfast + + * gmime/gmime.c (g_mime_init): Register all of our GObject types + with the glib type system so that there's less risk of a + race-condition in multi-threaded applications (not sure if this is + a justifiable concern or not, but it doesn't hurt). + +2008-09-15 Jeffrey Stedfast + + * gmime/gmime-message.c: Use the new InternetAddressList event + system. + + * gmime/internet-address.c: Implemented a custom event system + which gains us another 20% performance improvement. + +2008-09-14 Jeffrey Stedfast + + * gmime/gmime-object.c (g_mime_object_get_type): Register this + class as being abstract. + + * gmime/gmime-filter.c (g_mime_filter_get_type): Register this + class as being abstract. + + * gmime/gmime-stream.c (g_mime_stream_get_type): Register this + class as being abstract. + + * gmime/internet-address.c (decode_mailbox): Pass name->len to + g_utf8_validate() rather than -1 since we have the length. Might + save us some cycles. + (internet_address_get_type): Register this class as being + abstract. + + * gmime/gmime-parser.c (parser_init): Initialize the headerbuf and + rawbuf buffers to something more reasonable. + +2008-09-14 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.3.10 + +2008-09-13 Jeffrey Stedfast + + Epic optimization hack-a-thon which resulted in another ~5% + performance improvement. + + * gmime/gmime-message.c (g_mime_message_init): Instead of using a + hash table for our recipients table, simply use an array since we + can easily look them up using the GMimeRecipientType as an array + index. Eliminates unnecessary memory and, most importantly, + performance overhead. + (message_add_recipients_from_string): Optimized quite a bit by + using the new internet_address_list_append/prepend functions. + + * gmime/gmime-utils.c (decode_addrspec): Updated for + g_mime_decode_domain() changes. + + * gmime/gmime-parse-utils.c (g_mime_decode_domain): Changed the + API a bit to prevent the need for string duplication/g_free + overhead in our callers. + + * gmime/gmime-parser.c (parser_fill): Keep track of the stream + offset ourselves. + + * gmime/internet-address.c (internet_address_list_append): Renamed + from internet_address_list_concat() and optimized slightly. + (internet_address_list_prepend): New function that prepends the + contents of a list to another list. + (_internet_address_set_name): New internal function which avoids + emitting a "changed" event in an attempt to enhance the + performance of internet_address_list_parse(). + (_internet_address_list_add): Same idea as + _internet_address_set_name(), but also takes ownership of the + InternetAddress' ref to avoid unnecessary ref/unref overhead. + (internet_address_mailbox_new): Instead of calling + internet_address_mailbox_set_addr(), set it manually to avoid a + g_signal_emit(). + (internet_address_group_new): Call _internet_address_set_name() to + avoid signal emission. + (internet_address_group_add_member): Now returns the index of the + newly added member. + (decode_mailbox): Avoid string duplication of the addrspec token, + use the new g_mime_decode_domain() API to avoid unnecessary + strdup/g_free overhead, and use _internet_address_set_name(). + (decode_address): Don't need to unref members anymore as the lists + we add them to take ownership of the refs. + +2008-09-12 Jeffrey Stedfast + + I/O Optimization which improved performance by ~5% + + * gmime/gmime-parser.c (parser_fill): Now takes an 'atleast' + argument which we use to decide whether we should bother calling + read() or not. If we have more than 'atleast' bytes left in our + buffer, we don't read. + (parser_scan_content): Take advantage of the 'atleast' argument to + parser_fill(). + (parser_step_headers): Same. + (parser_step_from): Here too. + (parser_skip_line): And here. + +2008-09-08 Jeffrey Stedfast + + * gmime/gmime-message.c (message_add_recipients_from_string): + Prepend, append, or set the addresses in the recipients list + depending on the new 'action' argument. + (process_header): Pass along our 'action' to + message_add_recipients_from_string(). + (message_prepend_header): Pass PREPEND as the action argument to + process_header(). + (message_append_header): Pass APPEND as the action argument to + process_header(). + (message_set_header): Pass SET as the action argument to + process_header(). + + * gmime/gmime-header.c (g_mime_header_list_set): If there is more + than a single header with the specified name, remove them. + +2008-09-07 Jeffrey Stedfast + + * util/memchunk.[c,h]: Removed. No longer used. + +2008-09-07 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.3.9 + +2008-09-07 Jeffrey Stedfast + + New feature needed by the Bongo project (seems DBMail could also + use this feature as they currently have a hack-around). + + * tests/test-mbox.c: Output header offsets as well so that they + can be checked. + + * gmime/gmime-parser.c (g_mime_parser_get_headers_begin): New + function to get the beginning offset of the message headers. + (g_mime_parser_get_headers_end): Same, but for the end offset. + (parser_step_headers): Only set priv->headers_begin and + priv->headers_end if they are set to -1, we don't want to + overwrite this value if parsing a subpart. + (parser_step): Reset priv->headers_begin and priv->headers_end + when appropriate. + +2008-09-07 Jeffrey Stedfast + + * gmime/gmime-charset.c (g_mime_charset_map_init): Create the + iconv_charsets hashtable using g_hash_table_new_full() so that we + don't have to call g_hash_table_foreach() before destroying it in + g_mime_charset_map_shutdown(). + + * gmime/gmime-gpg-context.c: Use g_hash_table_new_full() so that + we don't have to g_hash_table_foreach() to remove all user-id + hints before destroying the user-id hint hashtable. + + * util/cache.c: Updated to use GSlice instead of a custom MemChunk + allocator. + + * util/gtrie.c: Updated to use GSlice instead of my custom + MemChunk. The main purpose for using the MemChunk allocator had + been ease of cleanup, but it made it more difficult to use GTrie + elsewhere. + + * examples/basic-example.c: Updated for the foreach() changes. + + * gmime/gmime-multipart.c (g_mime_multipart_foreach): Changed to + be recursive. The callback function signature has changed a bit to + be more useful as well by providing the parent MIME object. + + * gmime/gmime-message.c (g_mime_message_foreach): Same. + +2008-09-06 Jeffrey Stedfast + + * gmime/gmime-multipart.c (g_mime_multipart_get_subpart_from_content_id): + Multiparts can have Content-Id's too. + +2008-09-06 Jeffrey Stedfast + + * gmime/gmime-part.c (g_mime_part_set_content_object): Made + virtual, seems like it could be useful. + + * gmime/gmime-object.c (set_content_type): Do not serialize the + GMimeContentType object to the headers. This is done elsewhere + now. + (g_mime_object_set_content_type): After calling the virtual + set_content_type(), serialize the GMimeContentType object to the + headers. + + * gmime/gmime-multipart-encrypted.c: Get rid of the protocol + member variable, it's not needed. + + * gmime/gmime-multipart-signed.c: Get rid of the protocol and + micalg member strings, these aren't needed - just request them + from the content_type. + + * gmime/gmime-multipart.c: Get rid of boundary member variable, we + can just request it from the ContentType object. No sense + duplicating strings. + + * gmime/gmime-message.c (message_get_headers): Don't write out a + MIME-Version header if a Content-Type header doesn't exist. + + * gmime/gmime-parser.c (parser_content_type): Instead of returning + a GMimeContentType object, we now return a simpler ContentType + struct so that we don't waste time processing more of the header + than we need to, all we need is the type/subtype to figure out + which MIME object type to instantiate. + (parser_scan_message_part): After finishing parsing the object, + destroy the content_type ourselves. + (parser_construct_leaf_part): Updated. Don't set a + GMimeContentType on the GMimeObject unless the Content-Type header + doesn't exist (if it does exist, then appending the Content-Type + header will cause one to be created and set on the GMimeObject). + (parser_construct_multipart): Updated. + + * gmime/gmime-content-type.c (g_mime_content_type_new_from_string): + Use the new g_mime_parse_content_type() utility function and set + the parsed string values on the new GMimeContentType object + directly to avoid unnecessary strdup()ing. + + * gmime/gmime-parse-utils.c (g_mime_parse_content_type): New + function to parse the simple type/subtype Content-Type form. + +2008-08-31 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.3.8 + +2008-08-31 Jeffrey Stedfast + + * mono/Multipart.custom: GMime.Multipart now implements the IList + interface. + + * gmime/gmime-message.c (g_mime_message_add_recipients_from_string): + Removed. This function was a kludge - use + g_mime_message_get_recipients() and then add recipients you have + manually instead. + + * gmime/gmime-multipart.c (g_mime_multipart_clear): New method. + (g_mime_multipart_contains): Same. + (g_mime_multipart_index_of): Same. + +2008-08-31 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_scan_multipart_subparts): Updated + for GMimeMultipart API changes. + + * gmime/gmime-multipart-signed.c (sign_prepare): Updated for + GMimeMultipart API changes. + (g_mime_multipart_signed_sign): Same. + + * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt): + Updated for GMimeMultipart API changes. + + * gmime/gmime-multipart.c (g_mime_multipart_add): Renamed from + g_mime_multipart_add_part(). The "_part" seemed superfluous. + (g_mime_multipart_remove): Same. + (g_mime_multipart_remove_at): Same. + (g_mime_multipart_insert): Renamed from + g_mime_multipart_add_part_at(). + (g_mime_multipart_get_count): Renamed to be more obvious. + +2008-08-31 Jeffrey Stedfast + + * gmime/gmime-message-partial.c (g_mime_message_partial_new): Need + to unref the content_type after setting it on the object. + + * gmime/gmime-message-part.c (g_mime_message_part_new): Need to + unref the content_type after setting it on the object. + + * gmime/gmime-multipart.c (g_mime_multipart_new): Need to unref + the content_type after setting it on the object. + (g_mime_multipart_new_with_subtype): Same. + + * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_sign): + Need to unref the content_type after setting it on the + object. Also need to set mps->protocol /before/ we use it. + + * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_new): + Need to unref the content_type after setting it on the object. + (g_mime_multipart_encrypted_encrypt): Same. + + * gmime/gmime-part.c (g_mime_part_new): Need to unref the + content_type after setting it on the object. + (g_mime_part_new_with_type): Same. + (g_mime_part_set_content_header): Removed. + (g_mime_part_get_content_header): Removed. + (g_mime_part_set_filename): Don't need to pre-set a + ContentDisposition on the object if it is NULL, + g_mime_object_set_content_disposition_parameter() will do that for + us. + + * gmime/gmime-parser.c (parser_construct_leaf_part): Instead of + going around the GMimeObject's back to set the content_type, call + g_mime_object_set_content_type(). + (parser_construct_multipart): Same. + + * gmime/gmime-object.c: Updated for GMimeContentType and + ContentDisposition GObjectification. + (g_mime_object_new): New function. + + * gmime/gmime-disposition.c: Subclass GObject. + + * gmime/gmime-content-type.c: Subclass GObject. + + * gmime/internet-address.c: Got rid of unneeded vfuncs for the + changed event (which we don't want to be made public). + +2008-08-25 Jeffrey Stedfast + + Making GMime's object-returning APIs consistent with Gtk+ which do + not ref returned objects. + + * tests/test-headers.c (test_header_sync): No longer need to unref + the InternetAddressList object returned from + g_mime_message_get_recipients(). + + * tests/test-mbox.c (print_mime_struct): Since + g_mime_multipart_get_part() no longer returns a ref'd object, no + need to unref it once we're done with it. + + * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_decrypt): + Don't ref the returned decrypted part. + + * gmime/gmime-message-part.c (g_mime_message_part_get_message): + Don't ref the returned message part. + + * gmime/gmime-data-wrapper.c (g_mime_data_wrapper_get_stream): + Don't ref the returned stream. + + * gmime/gmime-part.c (g_mime_part_get_content_object): Don't ref + the returned content object anymore. + + * gmime/gmime-multipart.c (multipart_get_part): No longer ref the + returned part. + (g_mime_multipart_get_subpart_from_content_id): Same. + + * gmime/gmime-message.c (g_mime_message_get_recipients): Don't ref + the list anymore. + (g_mime_message_get_mime_part): Don't ref the returned mime part + anymore. + + * gmime/gmime-object.c (g_mime_object_get_content_type): Don't + return const anymore. We want app devs to be able to manipulate + the GMimeContentType directly. + (g_mime_object_get_content_disposition): Same idea here. + + * gmime/internet-address.c (internet_address_group_get_members): + Don't ref the members list anymore. + (internet_address_list_get_address): Same. + +2008-08-24 Jeffrey Stedfast + + * tests/test-headers.c (test_header_sync): Check that changes to + the GMimeContentType, GMimeDisposition, and InternetAddressList + objects cause a re-sync of the GMimeObject/GMimeMessage headers. + + * gmime/internet-address.c (internet_address_list_add): Connect to + the added address's changed signal. Exposed by my new test-suite + code. + (internet_address_list_insert): Assert index >= 0, not < 0. + (internet_address_list_remove_at): Same. + (internet_address_list_get_address): Same. + (internet_address_list_set_address): Same. + (internet_address_list_to_string): Return NULL if the list is + empty. This makes it easier to keep the new behavior of keeping + around InternetAddressList objects in GMimeMessage the same as the + old behavior when all of the addresses have been removed. + + * gmime/gmime-disposition.c (g_mime_content_disposition_set_params): + New function. + + * gmime/gmime-content-type.c (g_mime_content_type_set_media_type): + New function. + (g_mime_content_type_set_media_subtype): Another new function. + (g_mime_content_type_set_params): New function. + +2008-08-19 Jeffrey Stedfast + + * gmime/gmime-message.c: Updated to listen to changed events from + recipient lists and to update the headers when the lists change. + + * gmime/internet-address.c: InternetAddress is now GObject with a + "changed" signal. Split out InternetAddressMailbox and + InternetAddressGroup subclasses of + InternetAddress. InternetAddressList is now also a GObject with a + "changed" signal. These changes were made so that manipulating an + InternetAddress[List] of recipients will auto-magically update + GMimeMessage's corresponding recipient header. + +2008-08-18 Jeffrey Stedfast + + * gmime/gmime-message.c (g_mime_message_get_recipients): Now + returns a ref'd version of the InternetAddressList. You must now + unref the list when you are done with it. + + * tools/gmime-port-2-2-to-2-4.sh: Updated. + + * gmime/internet-address.c (internet_address_new_mailbox): Renamed + from internet_address_new_name() to make it less ambiguous (and to + use the terminology used in the RFC's). + (internet_address_get_type): Now takes a const InternetAddress + argument. + (internet_address_get_name): Same. + (internet_address_get_addr): Same. + (internet_address_get_members): Same, but now returns a ref'd + InternetAddressList rather than a const InternetAddressList. + (internet_address_list_ref): InternetAddressLists are now + reffable. + (internet_address_list_unref): Same. + (internet_address_list_get_address): Now returns a ref'd copy of + the InternetAddress at the index specified. + +2008-08-16 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.3.7 + +2008-08-16 Jeffrey Stedfast + + Fixes to actually pass the test suite. D'oh! + + * gmime/gmime-message.c (process_header): Protect against passing + a NULL list to internet_address_list_to_string(). + (g_mime_message_add_recipient): Create a new InternetAddressList + if it doesn't already exist in the hash table. + (message_add_recipients_from_string): Protect against passing a + NULL list to internet_address_list_concat(). + + * gmime/internet-address.c (_internet_address_list_to_string): + Fixed the logic to avoid adding a ',' after the last email + address. + +2008-08-16 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.3.6 + +2008-08-16 Jeffrey Stedfast + + * mono/InternetAddressList.cs: Rewritten to be more awesome. Now + implements IList. + + * tools/gmime-port-2-2-to-2-4.sh: Updated. + + * gmime/gmime-message.c: Updated for InternetAddressList API + changes. + + * gmime/internet-address.c: Completely reworked the + InternetAddressList API. + (internet_address_list_parse_string): Renamed from + internet_address_parse_string(). + +2008-08-15 Jeffrey Stedfast + + * gmime/internet-address.c (decode_mailbox): Implemented a + work-around for broken email addresses that have more than a + single '.' between word tokens making up the local-part of an + addr-spec. See Evolution bug #547969 for details. + +2008-08-07 Jeffrey Stedfast + + * gmime/gmime-message-part.c (g_mime_message_part_get_message): + Only ref the message if it is non-NULL. Thanks to Peter Bloomfield + for this fix. + +2008-07-19 Jeffrey Stedfast + + * gmime/gmime-header.c (g_mime_header_iter_get_offset): Disable + for now, currently it never gets set. + +2008-07-11 Jeffrey Stedfast + + * src/uudecode.c (uudecode): Don't base64 decode the + end-tag ("====\n"). Fixes bug #542222. + +2008-07-08 Jeffrey Stedfast + + * COPYING: Fixed to reference LGPL v2.1 + + * docs/reference/gmime-sections.txt: Updated. + + * gmime/gmime-header.c (g_mime_header_list_foreach): Added back + since it's fairly simple and makes it easier for apps to be ported + over to GMime 2.4 + + * gmime/gmime-message.h: Removed unused prototypes. + + * gmime/gmime-common.h: Same. + +2008-07-05 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Doltified and bumped version to 2.3.5 + +2008-07-04 Jeffrey Stedfast + + * mono/Message.custom: Updated. + + * gmime/gmime-message.[c,h]: Make GMIME_RECIPIENT_TYPE_* string + macros into an enum. Translate the enum into strings as + appropriate internally. + +2008-07-04 Jeffrey Stedfast + + Fixes bug #541578 + + * gmime/gmime-message.c (g_mime_message_add_recipient): Change + 'type' argument to const char *. + (g_mime_message_add_recipients_from_string): Same. + +2008-06-20 Jeffrey Stedfast + + * gmime/gmime-multipart.c (g_mime_multipart_remove_part): Fixed + g_return macros to return bool instead of void. + + * gmime/gmime-cipher-context.c (g_mime_signer_get_errors): Fixed + the function name to match the prototype name. + + * gmime/gmime-header.c (g_mime_header_list_remove): Fixed the + g_return macros here too. Also need to make sure to return TRUE at + the end of the function. + + * gmime/gmime-part.c (write_content): Don't unred filtered_stream + if we haven't used it. + + * gmime/gmime-object.c (g_mime_object_remove_header): Fixed + g_return macros, this function returns bool, not void. + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Get rid of + unused variable. + +2008-06-18 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.3.4 + +2008-06-15 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (status_backup): Use the bitwise + nearest_pow() implementation. + +2008-06-14 Jeffrey Stedfast + + * gmime/gmime-parser.c: When mallocing header/raw buffers, malloc + a power-of-2 rather than a power-of-2 + 1. Also optimized the + logic to calculate the amount of memory to realloc. + +2008-06-12 Jeffrey Stedfast + + * gmime/gmime-encodings.h (GMIME_QP_ENCODE_LEN): Add an extra byte + for \n in the case of quoted_encode_close(). Thanks to Peter + Bloomfield for discovering this. + +2008-06-08 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): added + constants for MD2, TIGER and HAVAL. + +2008-06-08 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.3.3 + + * docs/reference/changes-2.4.sgml: Updated. + + * PORTING: Updated. + +2008-06-07 Jeffrey Stedfast + + * gmime/*.h: Finished documenting all of the structs. Now at 100% + symbols documented! Woot! + + * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_sign): + Use the GMimeCipherHash returned from g_mime_cipher_context_sign() + to create the micalg parameter value - this way if the requested + hash was DEFAULT, we set the micalg to the proper value. + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Parse which + hash algorithm was actually used by gpg. + (gpg_hash_str): Updated to return strings for the new SHA + algorithms added this past week. + (gpg_sign): Return the hash algorithm actually used. + + * gmime/gmime-cipher-context.c (g_mime_cipher_context_sign): This + method now returns -1 on fail or the GMimeCipherHash on success. + +2008-06-07 Jeffrey Stedfast + + * gmime/gmime-parse-utils.c (g_mime_decode_word): No longer + returns a strdup'd string, this helps increase the performance of + the address parser and reduces memory fragmentation. + + * gmime/gmime-utils.c (g_mime_references_decode): Updated for + decode_word() changes. + (decode_addrspec): Same. + + * gmime/internet-address.c (decode_mailbox): Make sure we don't + stray beyond the end of the input string. Also updated for changes + to decode_word() (which now returns a const string rather than a + strdup'd string). + + * gmime/gmime-header.c (g_mime_header_iter_is_valid): Fixed an FMR + when the header the cursor is pointing to has been removed by + validating the hdrlist version first. + +2008-06-06 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.3.2 + + * gmime/*.[c,h]: Updated a bunch of gtk-doc documentation. + +2008-06-05 Jeffrey Stedfast + + * gmime/gmime-message.c (g_mime_message_get_date_as_string): + Renamed from g_mime_message_get_date_string(). + (g_mime_message_set_date_as_string): New function to provide + another means of setting a date (might help with some bindings + where time_t and tz_offsets are more difficult to work with). + + * mono/GMime.metadata: Fixed MessagePartial.ReconstructMessage + binding, thanks to Mike Kestner for helping me figure out the + proper metadata kung-fu to achieve this. + + * gmime/gmime-object.c: Get rid of the 'init' class method, + GObject already has an initializer (must be a leftover from before + the port to GObject). + (g_mime_object_new_type): Don't call GMimeObject->init(), + g_object_new() has already initialized the object. + + * gmime/gmime-multipart.c (g_mime_multipart_remove_part): Now + returns TRUE or FALSE. + +2008-06-04 Jeffrey Stedfast + + * tests/test-pgp.c (main): Test encrypt+sign and decrypt+verify as + well. + +2008-06-03 Jeffrey Stedfast + + * tests/test-pgpmime.c: Updated to test for + multipart/encrypted+sign + + * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt): + Changed to take 'sign' and 'userid' arguments so that it is + possible to both sign and encrypt the content. + (g_mime_multipart_encrypted_decrypt): Updated to save the + GMimeSignatureValidity from our call ot + g_mime_cipher_context_decrypt() so that callers can choose to get + the signer validity (in the case where the encrypted part was also + signed). + (g_mime_multipart_encrypted_get_signature_validity): New function. + + * gmime/gmime-gpg-context.c (gpg_decrypt): Updated to return a + GMimeSignatureValidity. + (gpg_ctx_parse_signer_info): Split out from gpg_ctx_parse_status() + to parse signer info. + (gpg_ctx_parse_status): Updated VERIFY mode to call + gpg_ctx_parse_signer_info() and made DECRYPT also call it so that + we properly collect signer info when the encrypted stream was also + signed. + (gpg_encrypt): Respect the 'sign' argument. + + * gmime/gmime-cipher-context.c (g_mime_cipher_context_decrypt): + Now returns a GMimeSignatureValidity in case the encrypted stream + was also signed. + +2008-06-02 Jeffrey Stedfast + + * gmime/gmime-message-partial.c (message_partial_message_new): Use + an iter on the stack. + + * gmime/gmime-header.[c,h]: Changed iters again. Iters are now + able to be allocated on the stack by making the struct public, + however this means that they are more sensitive to changes in the + HeaderList (e.g. all iters other than the one used to remove a + header become invalid regardless of whether or not the header they + refer to still exists). + +2008-06-01 Jeffrey Stedfast + + * gmime/gmime-header.c (g_mime_header_iter_new): New function to + allocate an iter on the heap. + (g_mime_header_iter_copy_to): New copy function so that you can + copy to a pre-allocated destination iter. + (g_mime_header_list_get_iter): Changed the API a bit. Instead of + returning a newly allocated iter, instead return bool and take an + iter arg to initialize. + +2008-06-01 Jeffrey Stedfast + + * tools/gmime-port-2-2-to-2-4.sh: New helper tool to port existing + GMime 2.0 and 2.2 based applications over to GMime 2.4. + + * gmime/gmime-part.c: Updated for GMimeFilterCRLF changes. + + * gmime/gmime-multipart-signed.c: Updated for GMimeFilterCRLF + changes. + + * gmime/gmime-multipart-encrypted.c: Updated for GMimeFilterCRLF + changes. + + * gmime/gmime-filter-crlf.c (g_mime_filter_crlf_new): No longer + takes 2 enum arguments, rather it now takes 2 bool arguments which + makes the API simpler to understand. + + * gmime/gmime-filter-best.c (g_mime_filter_best_new): Changed the + unsigned int flags argument to be an enum so developers could more + easily figure out what the argument was. + + * gmime/gmime-param.c (g_mime_param_next): New helper function for + bindings. + (g_mime_param_get_name): Same. + (g_mime_param_get_value): Same. + +2008-05-31 Jeffrey Stedfast + + * tests/test-html.c (main): Updated. + + * tests/test-best.c (main): Updated. + + * src/uuencode.c (uuencode): Updated. + + * gmime/gmime-part.c: Updated for filter stream change. + + * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_sign): + Updated for filter stream change. + + * gmime/gmime-multipart-encrypted.c: Updated for filter stream + change. + + * gmime/gmime-gpg-context.c (gpg_ctx_new): Updated for filter + stream change. + + * gmime/gmime-filter-yenc.c (g_mime_filter_yenc_new): Now takes a + bool encode argument rather than a GMimeFilterYencDirection - no + sense making this more complicated than it needs to be. + + * gmime/gmime-stream-filter.c (g_mime_stream_filter_new): Renamed + from g_mime_stream_filter_new_with_stream(). This is the only + constructor, so should be named _new(). + +2008-05-31 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.3.1 + + * gmime/gmime-header.c (g_mime_header_list_invalidate_iters): Only + unlink the iter if the headers are being destroyed. + + * gmime/gmime-gpg-context.c: Updated. + + * gmime/gmime-cipher-context.c: Added GMimeCipherHash enums for + SHA-224, SHA-256, SHA-384 and SHA-512. + (g_mime_signer_next): New function to ease binding. + (g_mime_signer_set_status): Same. + (g_mime_signer_get_status): Same. + (g_mime_signer_set_error): Same. + (g_mime_signer_get_error): Same. + (g_mime_signer_set_trust): Same. + (g_mime_signer_get_trust): Same. + (g_mime_signer_set_fingerprint): Same. + (g_mime_signer_get_fingerprint): Same. + (g_mime_signer_set_key_id): Same. + (g_mime_signer_get_key_id): Same. + (g_mime_signer_set_name): Same. + (g_mime_signer_get_name): Same. + (g_mime_signer_set_sig_created): Same. + (g_mime_signer_get_sig_created): Same. + (g_mime_signer_set_sig_expire): Same. + (g_mime_signer_get_sig_expire): Same. + +2008-05-31 Jeffrey Stedfast + + * gmime/gmime-object.c (g_mime_object_get_header_list): New + function to get at the GMimeObject headers. + + * gmime/gmime-message-partial.c (message_partial_message_new): Use + iters to copy the headers. + + * gmime/gmime-header.c (g_mime_header_list_foreach): Removed, this + API sucked. + +2008-05-31 Jeffrey Stedfast + + * tests/test-headers.c: New set of unit tests for GMimeHeaderIter. + + * gmime/gmime-header.c (g_mime_header_iter_equal): New method to + check if two iters are equal. + (g_mime_header_iter_first): New method to update @iter to point to + the first header. + (g_mime_header_iter_last): New method to update @iter to point to + the last header. + (g_mime_header_iter_next): Fixed. + (g_mime_header_iter_prev): Fixed. + (g_mime_header_iter_remove): Invalidate all other iters currently + pointing to the same header as @iter. + +2008-05-30 Jeffrey Stedfast + + * gmime/gmime-parser.c: Updated for GMimeHeaderList and + GMimeObject changes. + + * gmime/gmime-message-partial.c: Updated for GMimeHeaderList and + GMimeObject changes. + + * gmime/gmime-multipart-encrypted.c: Updated for GMimeHeaderList + and GMimeObject changes. + + * gmime/gmime-multipart-signed.c: Updated for GMimeHeaderList and + GMimeObject changes. + + * gmime/gmime-multipart.c: Updated for GMimeHeaderList and + GMimeObject changes. + + * gmime/gmime-part.c: Updated for GMimeHeaderList and GMimeObject + changes. + + * gmime/gmime-message.c: Updated for GMimeHeaderList and + GMimeObject changes. + + * gmime/gmime-object.c (g_mime_object_append_header): Renamed from + g_mime_object_add_header(). + (g_mime_object_prepend_header): New method. + (remove_header): Cleanup content-header variables if they get + removed. Don't allow removal of the Content-Type header. + + * gmime/gmime-header.[c,h]: Renamed GMimeHeader to GMimeHeaderList + and all of it's methods appropriately. Added a new GMimeHeaderIter + class for iterating over a header list. + (g_mime_header_list_remove): Return gboolean specifying whether or + not a header was removed. + (g_mime_header_list_get_iter): New function to get a header + iterator. + +2008-05-30 Jeffrey Stedfast + + * util/cache.c: Updated for list.[c,h] changes. + + * util/list.c (list_append): Renamed from list_append_node(). + (list_prepend): Renamed from list_prepend_node(). + (list_unlink): Renamed from list_node_unlink(). + +2008-05-30 Jeffrey Stedfast + + * gmime/gmime-message.c (g_mime_message_get_headers): Removed as + GMimeObject has an equivalent method. + (handle_multipart_alternative): Removed. + (handle_multipart_mixed): Removed. + (g_mime_message_get_header): Removed, this has equivalent + functionality on GMimeObject. + (g_mime_message_set_header): Same. + (g_mime_message_add_header): Same. + +2008-05-28 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.3.0 + +2008-05-28 Jeffrey Stedfast + + These changes are to make it so that changing the GMimeContentType + and/or GMimeContentDisposition fields directly will still update + the headers. + + * gmime/gmime-disposition.c (g_mime_content_disposition_set_disposition): + Notify our parent object that we've changed. + (g_mime_content_disposition_set_parameter): Same. + + * gmime/gmime-content-type.c (g_mime_content_type_set_parameter): + Notify our parent object that we've changed. + + * gmime/gmime-object.c (_g_mime_object_content_type_changed): + Renamed from sync_content_type() and also made callable from + gmime-content-type.c + (_g_mime_object_content_disposition_changed): Renamed from + sync_content_disposition() and also made callable from + gmime-disposition.c + (g_mime_object_set_content_type): Set the parent object on the + GMimeContentType and call _g_mime_object_content_type_changed(). + (g_mime_object_set_content_disposition): Set the parent object on + the GMimeContentDisposition and call + _g_mime_object_content_disposition_changed(). + +2008-05-28 Jeffrey Stedfast + + * gmime/gmime-encodings.c: New source file containing all the + basic MIME encoding functions. + + * src/uuencode.c: Updated. + + * src/uudecode.c: Updated. + + * gmime/gmime-parser.c: Updated for GMimeContentEncoding change. + + * gmime/gmime-multipart-signed.c: Updated for GMimeContentEncoding + change. + + * gmime/gmime-multipart-encrypted.c: Updated for + GMimeContentEncoding change. + + * gmime/gmime-message-partial.c: Updated for GMimeContentEncoding + change. + + * gmime/gmime-filter-best.c (g_mime_filter_best_encoding): Updated + to use the new GMimeContentEncoding enum. + + * gmime/gmime-data-wrapper.c: Updated to use GMimeContentEncoding + enum. + (write_to_stream): Drastically simplified using the new + GMimeFilterBasic API. + + * gmime/gmime-filter-basic.c: Updated to use the new GMimeEncoding + API. + (g_mime_filter_basic_new): Renamed and changed the arguments. We + now just re-use the GMimeContentEncoding enum and a bool to + declare encode vs decode. + + * gmime/gmime-utils.c (g_mime_references_free): New function to + simplify bindings. + (g_mime_utils_best_encoding): Updated to use the new + GMimeContentEncoding enum. + (g_mime_utils_base64_encode_close): Moved to gmime-encodings.c + and renamed to g_mime_encoding_base64_encode_close(). + (g_mime_utils_base64_encode_step): Same. + (g_mime_utils_base64_decode_step): Same. + (g_mime_utils_uuencode_close): Same. + (g_mime_utils_uuencode_step): Same. + (g_mime_utils_uudecode_step): Same. + (g_mime_utils_quoted_encode_close): Same. + (g_mime_utils_quoted_encode_step): Same. + (g_mime_utils_quoted_decode_step): Same. + + * gmime/gmime-utils.h (GMimePartEncodingType): Removed. This enum + has been replaced. + + * gmime/gmime-part.c (g_mime_part_set_content_type): Removed, + GMimeObject already has this functionality. + (g_mime_part_get_content_type): Same. + (g_mime_part_set_content_encoding): Renamed from + g_mime_part_set_encoding() and updated to use the new + GMimeContentEncoding enum. + (g_mime_part_get_content_encoding): Renamed from + g_mime_part_get_encoding() and updated to use the new + GMimeContentEncoding enum. + (g_mime_part_encoding_to_string): Removed, equivalent + functionality has been added to gmime-encodings.c named + g_mime_content_encoding_to_string(). + (g_mime_part_encoding_from_string): Removed, equivalent + functionality has been added to gmime-encodings.c named + g_mime_content_encoding_from_string(). + (write_content): Updated for new GMimeFilterBasic API which helps + simplify this. + +2008-05-27 Jeffrey Stedfast + + * gmime/gmime-utils.c (g_mime_references_get_message_id): New + accessor function to ease bindings. + (g_mime_references_get_next): Renamed from + g_mime_references_next() for consistency. + (g_mime_utils_8bit_header_decode): Removed. + (g_mime_utils_8bit_header_encode): Removed. + (g_mime_utils_8bit_header_encode_phrase): Removed. + + * gmime/gmime-disposition.c (g_mime_content_disposition_get_params): + New accessor function to ease bindings. + + * gmime/gmime-content-type.c (g_mime_content_type_get_media_type): + New accessor function to ease bindings. + (g_mime_content_type_get_media_subtype): Same. + (g_mime_content_type_get_params): Same. + +2008-05-27 Jeffrey Stedfast + + * examples/basic-example.c: Fixed to use GMimeSignatureValidity. + + * gmime/gmime-cipher-context.c (g_mime_cipher_*): Removed, since + we're not going to maintain compatability with 2.2, no sense + keeping these wrappers around. + (g_mime_cipher_validity_*): Removed. No one should still be using + these... + +2008-05-26 Jeffrey Stedfast + + * gmime/gmime-message.c (g_mime_message_get_body): Removed. + + * gmime/gmime-disposition.c: Changed GMimeDisposition to + GMimeContentDisposition and updated method names to match. + (g_mime_content_disposition_new_from_string): Same as the old + g_mime_disposition_new(). + (g_mime_content_disposition_new): New ctor that doesn't take any + args. + (g_mime_content_disposition_set_parameter): Renamed from + g_mime_disposition_add_parameter(). + (g_mime_content_disposition_get_disposition): Renamed from + g_mime_disposition_get(). + (g_mime_content_disposition_set_disposition): Renamed from + g_mime_disposition_set(). + + * gmime/gmime-object.c: Moved Content-Disposition handling here. + (g_mime_object_get_content_disposition): New method which is the + equivalent of g_mime_part_get_content_disposition_object(). + (g_mime_object_set_content_disposition): New method which is the + equivalent of g_mime_part_set_content_disposition_object(). + (g_mime_object_get_disposition): New method which is the + equivalent of g_mime_part_get_content_disposition(). + (g_mime_object_set_disposition): New method which is the + equivalent of g_mime_part_set_content_disposition(). + (g_mime_object_get_content_disposition_parameter): New method + which is the equivalent of + g_mime_part_get_content_disposition_parameter(). + (g_mime_object_set_content_disposition_parameter): New method + which is the equivalent of + g_mime_part_add_content_disposition_parameter(). + + * gmime/gmime-part.c (g_mime_part_get_content_disposition_object): + Moved functionality to GMimeObject. + (g_mime_part_set_content_disposition_object): Same. + (g_mime_part_set_content_disposition): Same. + (g_mime_part_get_content_disposition): Same. + (g_mime_part_add_content_disposition_parameter): Same. + (g_mime_part_get_content_disposition_parameter): Same. + (g_mime_part_set_content): Removed long-deprecated function. + (g_mime_part_set_content_byte_array): Same. + (g_mime_part_set_pre_encoded_content): Same. + (g_mime_part_get_content): Same. + (g_mime_part_set_content_type): + Removed... equivalent functionality already on GMimeObject. + (g_mime_part_get_content_type): Same. + +2008-05-25 Jeffrey Stedfast + + * gmime/gmime-multipart-encrypted.c (g_mime_multipart_encrypted_encrypt): + Don't use g_mime_part_set_content() as it is a deprecated + function. + + * gmime/gmime-part.c (g_mime_part_get_content_disposition_object): + Added an accessor to make bindings easier. + +2008-05-24 Jeffrey Stedfast + + * gmime/gmime-stream.c (stream_eos): Fixed a typo. + +2008-05-24 Jeffrey Stedfast + + * tests/test-pgp.c: Updated. + + * gmime/gmime-multipart-encrypted.c: Updated. + + * gmime/gmime-multipart-signed.c: Updated. + + * gmime/gmime-cipher-context.c (g_mime_cipher_context_*): Renamed + from g_mime_cipher_*() which did not match the class + name. Deprecated the old names. + +2008-05-24 Jeffrey Stedfast + + * gmime/gmime-message.c (g_mime_message_write_to_stream): + Removed. Removing all deprecated functions which have equivalent + functionality in a parent class. + (g_mime_message_to_string): Same. + + * gmime/gmime-object.c (g_mime_object_ref): Same. + (g_mime_object_unref): Same. + + * gmime/gmime-part.c (g_mime_part_write_to_stream): Same. + (g_mime_part_to_string): Same. + + * gmime/gmime-stream.c (g_mime_stream_ref): Same. + (g_mime_stream_unref): Same. + +2008-05-23 Jeffrey Stedfast + + * gmime/gmime-stream-fs.c: Cast offset arguments to lseek() to + off_t. + + * gmime/gmime-stream-file.c: Cast offset arguments to fseek() to + long. + + * gmime/gmime-stream-mmap.c (g_mime_stream_mmap_new_with_bounds): + Don't assign to st.st_size. + + * gmime/*.[c,h]: Use gint64 instead of off_t for public APIs. + + * mono/gmime-api.raw: s/off_t/gint64/g + +2008-05-23 Jeffrey Stedfast + + * mono/Makefile.am: Don't delay-sign, newer versions of Mono do + not allow this anymore. + + * mono/gmime-sharp.snk: New sign-key for signing gmime-sharp + assembly. + + * mono/AssemblyInfo.cs.in: Updated. + +2008-05-23 Jeffrey Stedfast + + * branched: now begins 2.3.x development + + * gmime-2.4.pc.in: Renamed from gmime-2.0.pc.in. + + * gmime-config.in: Removed. + + * gmimeConf.sh.in: Removed. + + * configure.in: Updated. + + * */Makefile.am: Rename lib name to gmime-2.4. + +2008-05-23 Jeffrey Stedfast + + * mono/StreamWrapper.cs: Allow seeking to position 0 for + GMimeStreamFilter. Thanks to Debajyoti Bera for this patch. + +2008-05-23 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.21 + + * gmime/gmime-parser.c: Check parser_step() against + GMIME_PARSER_STATE_ERROR rather than -1 in case the value ever + changes. + (struct _GMimeParserPrivate): Changed state to be 16bit int + instead of a 26bit int which apparently cannot be set to -1 on + Solaris. Fixes bug #534301. + (parser_step_headers): Fixed a corner-case where a read boundary + fell between the \n and \t of a folded header. + +2008-05-16 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.20 + +2008-05-15 Jeffrey Stedfast + + * gmime/gmime-stream-buffer.c (stream_read): Break if + g_mime_stream_read() returns 0 as well (meaning EOF, no more data + to read) and don't keep looping. Fixes bug #533331. + +2008-05-03 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.19 + +2008-05-02 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_step_headers): Fix for CRLF encoded + input. + +2008-04-05 Jeffrey Stedfast + + * gmime/gmime-parser.c (header_parse): Fixed a memory leak in the + case of an invalid header. + +2008-02-16 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.18 + +2008-03-13 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_construct_message): Changed + content_length to an unsigned long rather than unsigned int, fixes + bug #521872. Thanks to Pawel Salek for this fix. + +2008-03-10 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_scan_mime_part_content): Don't let + size go negative. + +2008-02-10 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.17 + +2008-02-09 Jeffrey Stedfast + + * gmime/gmime-filter-basic.c (filter_filter): Use the new macros + defined below. + + * gmime/gmime-utils.c (rfc2047_encode_word): Use the new macros. + + * gmime/gmime-utils.h: Added more accurate encoding-length macros + for base64, quoted-printable, and uuencode which are try to + minimize over-calculating the amount of output data that we + need. Also namespaced them. + +2008-02-08 Jeffrey Stedfast + + * src/uudecode.c (uudecode): Use g_strchomp() on the filename + parsed from the 'begin' line. + +2008-02-07 Jeffrey Stedfast + + * util/url-scanner.c (url_web_end): Handle IP address literals + within []'s. Fixes bug #515088. + +2008-02-06 Jeffrey Stedfast + + * gmime/gmime-utils.c (g_mime_utils_uuencode_step): Optimized. + +2008-02-03 Jeffrey Stedfast + + * gmime/gmime-stream-cat.c (stream_read): Removed an extra seek. + +2008-02-02 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.16 + +2008-02-02 Jeffrey Stedfast + + Fix for https://bugzilla.novell.com/show_bug.cgi?id=333292 and + some other bugs I discovered while fixing it. + + * gmime/gmime-parser.c (header_parse): Made an actual function + rather than a macro. Don't turn invalid headers into + X-Invalid-Headers, just ignore them. Instead of using + g_strstrip(), do our own lwsp trimming so we can do it before + malloc'ing - this helps reduce memory usage and memmove() + processing in g_strstrip(). + (parser_step_headers): Validate the header field names as we go so + that we can stop when we come to an invalid header in some + cases. May now return with 3 states rather than only 1: + HEADERS_END (as before), CONTENT (suggesting we've reached body + content w/o a blank line to separate it from the headers), and + COMPLETE (which suggests that we've reached the next message's + From-line). + (parser_skip_line): Rearranged a bit: don't fill unless/until we + need to. + (parser_step): For HEADERS_END state, skip a line and increment + state to CONTENT. No-op for CONTENT and COMPLETE states. + (parser_scan_message_part): parser_step() can return more than + just HEADERS_END on 'success' when starting with HEADERS state, so + check for error rather than HEADERS_END. + (parser_construct_leaf_part): No need to parser_step() thru header + parsing, they should already be parsed by the time we get + here. Also, don't call parser_skip_line() directly to skip the + blank line between headers and content, use parser_step() to do + that for us. + (parser_construct_multipart): Same as parser_construct_leaf_part() + (found_immediate_boundary): Now takes an 'end' argument so callers + can request a check against an end-boundary vs a part boundary. + (parser_scan_multipart_subparts): Check for errors with + parser_skip_line(). Set HEADERS state and use parser_step() to + parse headers rather than calling parser_step_headers() + directly. If, after parsing the headers, we are at the next + message (aka COMPLETE state) and we have no header list, then + break out of our loop and pretend we've found an + end-boundary. After parsing the content of each MIME part, check + that the boundary we found is our own and not a parent's (if it + belongs to a parent, break out). + (parser_construct_part): Loop parser_step() until we're at any + state past the header block (>= HEADERS_END). + (parser_construct_message): Same idea. Also, do error checking for + decoded content_length value. + +2008-02-02 Jeffrey Stedfast + + * gmime/gmime-iconv-utils.c (iconv_utils_init): Don't break if the + user's locale is unset (e.g. US-ASCII). + +2008-01-31 Jeffrey Stedfast + + * gmime/gmime-parser.c: Removed the need for 'unstep' state + information. + +2008-01-27 Jeffrey Stedfast + + * gmime/gmime-stream-buffer.c (stream_write): Don't modify the + passed-in arguments so that it makes debugging easier if there's + ever a bug. + +2008-01-27 Jeffrey Stedfast + + * gmime/gmime-stream-buffer.c (stream_read): Optimized the + BLOCK_READ code-path. + (stream_write): Optimized the BLOCK_WRITE code-path. + (stream_seek): Optimized the BLOCK_READ code-path. + (g_mime_stream_buffer_gets): Updated for the changes made to the + way bufptr is used in the BLOCK_READ case. + +2008-01-14 Jeffrey Stedfast + + * gmime/gmime-charset.c (g_mime_set_user_charsets): Deep copy the + string array. Fixes bug #509434. + +2008-01-03 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.15 + +2008-01-02 Jeffrey Stedfast + + * gmime/gmime-message.c (message_write_to_stream): Reworked the + logic to be easier to understand what is going on. + + * gmime/gmime-multipart.c (multipart_write_to_stream): In the case + where multipart->boundary is NULL /and/ we have a raw + header (suggesting a parsed message), do not set a boundary as it + will break the output because it will clobber the saved raw header + and GMimeMessage's write_to_stream() method will have skipped + writing its own headers if its toplevel part (us) have a raw + header set. In this case, also skip writing the end boundary. + +2008-01-01 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.14 + + * gmime/gmime-utils.c (g_mime_utils_generate_message_id): Fixed a + Free Memory Read access (FMR) by not freeing 'name' before using + it's value. Also reworked to take advantage of uname(2) or + getdomainname() to get the domain name if available to avoid + having to do a DNS lookup. + +2007-01-01 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.13 + +2008-01-01 Jeffrey Stedfast + + Fixes bug #506701 + + * gmime/gmime-utils.c (rfc2047_encode_get_rfc822_words): Don't + reset the word-type variable as it needs to be preserved when + breaking long words. + (rfc2047_encode): Switch on word->encoding - if 0, rfc2047 encode + as us-ascii. + +2007-12-27 Jeffrey Stedfast + + * gmime/gmime-utils.c (decode_8bit): Now takes a default_charset + argument which we use in place of the locale charet if + non-NULL. We also now always include this charset in our list of + charsets to check for a best-match (obviously this charset is + unlikely to be an exact fit if this function is getting called, so + we place it at the end of the list). + (rfc2047_decode_word): If given a valid charset in the + encoded-word token, always use that for charset conversion to UTF-8 + even if it doesn't convert fully. We don't want to fall back to + the user's supplied charset list because it may contain iso-8859-1 + which will likely always be a 'best-match' charset. + +2007-12-26 Jeffrey Stedfast + + * gmime/gmime-utils.c (g_mime_utils_decode_8bit): Made public. + + * gmime/internet-address.c (decode_mailbox): Instead of doing our + own thing to convert raw 8bit/multibyte text sequences into UTF-8, + use the same function we use in gmime-utils.c's header decoder. + +2007-12-25 Jeffrey Stedfast + + * gmime/charset-map.c: New source file to generate the charset + map (moved out of gmime-charset.c) + + * gmime/gmime-charset.c (main): Removed. + +2007-12-25 Jeffrey Stedfast + + * gmime/gmime-charset.c (main): Cleaned up the logic and made it + so that we can alias a block to a previous block if the blocks are + identical rather than just aliasing when all values in the block + are identical. Happens to make no difference in the output, but + the logic is now there if that ever changes. + +2007-12-24 Jeffrey Stedfast + + * gmime/gmime-charset-map-private.h: Regenerated. + + * gmime/gmime-charset.c (known_iconv_charsets): Map all of the + gb2312 aliases to GBK as GBK is a superset of gb2312 (apparently + some clients are tagging GBK as gb2312 which is missing some + glyphs contained within GBK). + (main): Added iso-8859-6 to the table for Arabic support. + +2007-12-16 Jeffrey Stedfast + + * gmime/gmime-utils.c (decode_8bit): When reallocing our output + buffer, we need to update outleft as well. + +2007-12-15 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.12 + +2007-12-08 Jeffrey Stedfast + + * gmime/gmime-utils.c (rfc2047_encode_merge_rfc822_words): + Completely rewritten with new logic which will hopefully group + words more logically. + +2007-12-08 Jeffrey Stedfast + + Fixes bug #498720 + + * gmime/internet-address.c (internet_address_list_writer): Renamed + from the temporary internet_address_list_fold() name. + (_internet_address_to_string): New internal function that writes + an InternetAddress to a GString, doing proper folding and rfc2047 + encoding if requested. + (internet_address_to_string): Use the new internal function. + + * tests/test-mime.c: Added another addrspec test and fixed up some + exception strings to be a little more helpful. + +2007-12-05 Jeffrey Stedfast + + * configure.in: Fixed a bug where explicitly disabling largefile + support would add -D_FILE_OFFSET_BITS=no to the compiler + CFLAGS. Also added a blaring WARNING when -enable-largefile is + passed. + +2007-11-23 Jeffrey Stedfast + + Attempt at solving bug #498720 for address fields, altho it should + probably be made to handle folding single addresses in the case + where they are too long to fit within a single line. + + * gmime/internet-address.c (internet_address_list_fold): New + function. + + * gmime/gmime-message.c (write_structured): Renamed from + write_addrspec(). + (write_addrspec): New header writer that writes + InternetAddressLists in a nicely folded manner. + +2007-11-12 Jeffrey Stedfast + + * gmime/internet-address.c (internet_address_destroy): No need to + check if ia != NULL, we know this is true already. + +2007-11-12 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.11 + + * gmime/gmime-utils.c (g_mime_utils_header_decode_text): Fix for + bug #485005. + +2007-11-06 Jeffrey Stedfast + + * gmime/gmime-utils.c (rfc2047_decode_word): If the charset string + is empty, default to decode_8bit() and don't try to iconv_open() + it. + +2007-11-06 Jeffrey Stedfast + + * gmime/gmime-utils.c (is_rfc2047_token): Don't assume the charset + component of the token is >= 1 char, start checking for a '?' at + string index 2. + +2007-11-01 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Clear any + error we may have (bad passwd?) each pass so that we don't try to + set an error when one is already set. + +2007-10-27 Jeffrey Stedfast + + * gmime/gmime-message.c (g_mime_message_set_mime_part): Reset the + raw headers of the current top-level MIME part so that if it is + being used elsewhere, it won't carry along all the message headers + from this message. + +2007-10-24 Jeffrey Stedfast + + * gmime/gmime-part.c (g_mime_part_encoding_from_string): Handle + the value "uuencode" the same as we were handling "x-uuencode". + +2007-10-14 Jeffrey Stedfast + + Changed the license to LGPLv2 + +2007-10-13 Jeffrey Stedfast + + * tests/test-pgp.c (test_export): Skip past the PGP headers so as + to avoid comparing the "Version: " headers which might fail if a + newer gnupg is used than what created the pgp key originally. + +2007-10-13 Jeffrey Stedfast + + * gmime/gmime-filter-html.c: Updated for url-scanner.c symbol + changes. + + * util/url-scanner.[c,h]: Renamed symbols to get rid of the G + prefix and marked all symbols for internal linkage. + + * util/md5-utils.h: Declare symbols as internal. + + * util/memchunk.h: Here too. + + * util/cache.h: And here. + + * util/list.h: Same. + +2007-09-25 Joe Shaw + + * configure.in: Set an AM_CONDITIONAL for whether we are + building with large file support. + + * mono/GMime.metadata.in: Move GMime.metadata to this and + change any references of off_t to @off_t_type@, which is + substituted with the correct type. This is needed because + off_t is converted to an IntPtr by the gtk-sharp binding + generator, which is good for 64-bit systems and 32-bit + systems without large file support but breaks on 32-bit + systems with large file support. + + * mono/Makefile.am: Generate GMime.metadata from + GMime.metadata.in by using sed to replace @off_t_type@ + with gint64 on 32-bit systems with large file support + and long otherwise. + +2007-09-03 Jeffrey Stedfast + + * gmime/gmime-utils.c: Disabled a debug printf. + +2007-08-15 Joe Shaw + + * mono/DataWrapper.custom: We want to dispose of the GMime + stream immediately, since we don't use its managed wrapper + except to immediately pass it into the GMime.StreamFilter + constructor. + +2007-07-21 Jeffrey Stedfast + + * gmime/gmime-iconv-utils.c (g_mime_iconv_strndup): Save errno + before resetting the iconv descriptor so that we don't lose the + error. + +2007-07-19 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.10 + + * tests/test-mime.c: Added rfc2047_text entries for testing the + new workaround support. + + * gmime/gmime-utils.c (g_mime_utils_header_decode_text): + Implemented a conditional workaround for broken rfc2047 encodings. + +2007-07-03 Jeffrey Stedfast + + * gmime/gmime-common.c: Removed str[n]casecmp + +2007-05-21 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.9 + + * gmime/gmime-stream-cat.c (stream_substream): Fixed a memory leak + by always returning a GMimeStreamCat, even if the source list + contains only a single stream (probably better that it work this + way anyway for consistency), thanks again to Charles Kerr for + finding and presenting a fix for this. Fixes bug #440054. + + * gmime/gmime-stream-file.c (stream_seek): Oops, fseek() should + have been using SEEK_SET, not SEEK_END. Thanks to Charles Kerr for + the report and the fix. Fixes bug #439841. + +2007-04-25 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.8 + + * tests/test-pgp.c: Test exporting of keys. + + * gmime/gmime-utils.c (rfc2047_decode_word): Fixed compile + warnings. + + * gmime/gmime-stream-file.c (stream_reset): Removed an unused + variable. + + * gmime/gmime-charset.c (g_mime_charset_can_encode): + s/if (mask->level = 1)/if (mask->level == 1)/ + +2007-04-23 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.7 + +2007-04-14 Jeffrey Stedfast + + * gmime/*.c (g_mime_*_get_type): Set n_preallocs to 0. + +2007-04-12 Jeffrey Stedfast + + * gmime/*.c: no need for a second NULL argument to g_object_new() + + * util/cache.c (cache_new): Change max_size and node_size to be of + type size_t. + + * gmime/gmime-multipart-encrypted.c + (g_mime_multipart_encrypted_new): g_object_new() doesn't need a + second NULL argument. + + * gmime/gmime-utils.c (decode_8bit): Close the iconv descriptor + and since we are using is_ascii() now, we don't need to use + unsigned char *'s. + +2007-04-12 Jeffrey Stedfast + + * gmime/gmime-utils.c (decode_8bit): Use is_ascii(). + (g_mime_utils_header_decode_text): Same. + (g_mime_utils_header_decode_phrase): Here too. + + * gmime/gen-table.c: Added a is_ascii() macro for use instead of + the ctype isascii() so that I don't have to worry about casting. + +2007-04-11 Jeffrey Stedfast + + Revision 1119 (previous commit) made the following 2 functions + even less attractive than they already were, so I decided to + rewrite them especially since it wasn't hard to find a far cleaner + approach. + + * gmime/gmime-utils.c (g_mime_utils_header_decode_text): Rewritten + to be cleaner, faster, and more elegant. + (g_mime_utils_header_decode_phrase): Same. + +2007-04-11 Jeffrey Stedfast + + Fixes for bug #423760 and bug #342196 + + * gmime/gmime-charset.c (g_mime_charset_can_encode): New + convenience function to check whether a length of UTF-8 text can + be converted into the specified charset. + (g_mime_set_user_charsets): New function allowing an application + to provide GMime with a list of user-preferred charsets to use for + encoding and decoding headers. + (g_mime_user_charsets): New function to get the list of + user-preferred charsets. + + * gmime/gmime-utils.c (decode_8bit): New function to convert + arbitrary 8bit text into UTF-8 using the charset list provided by + g_mime_user_charsets(). + (rfc2047_decode_word): Don't assume that just because the declared + charset is UTF-8 that it actually is in UTF-8. + (rfc2047_decode_word): If we can't open a converter for the + declared charset to UTF-8 or if we can't convert from the declared + charset into UTF-8, fall back to using decode_8bit(). + (g_mime_utils_header_decode_text): Convert 8bit word tokens into + UTF-8 using decode_8bit(). + (g_mime_utils_header_decode_phrase): Same. + (rfc2047_encode_word): Be a little more efficient about removing + '\n' chars... + (rfc2047_encode): When encoding a level-2 word cluster, attempt to + fit the cluster within a charset provided by + g_mime_user_charsets() rather than using GMime's best-fit charset + table (unless, of course, it doesn't fit within any of the + user-specified charsets). + +2007-03-28 Jeffrey Stedfast + + * gmime/gmime-iconv-utils.c (g_mime_iconv_strndup): No need to + cast out to a char *, it already is. + + * gmime/gmime-stream-mem.c (g_mime_stream_mem_set_byte_array): + Only free the previous memory buffer if we were the owner. + +2007-03-28 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.6 - critical release for the + gmime-stream-fs and gmime-stream-file fixes below. + + * gmime/gmime-stream-filter.c (stream_reset): Try resetting source + stream first, this way if that fails we don't reset our state + either. + + * gmime/gmime-stream-fs.c (stream_reset): Same as below. + + * gmime/gmime-stream-file.c (stream_reset): Make sure to always + return 0 or -1, not the value from fseek()ing back to the + beginning of the stream (which might not be position 0). + +2007-03-27 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): If we aren't + in a UTF-8 locale, convert status messages into UTF-8 when using + the status line in the GError. + +2007-03-26 Jeffrey Stedfast + + * gmime/gmime-utils.c (g_mime_utils_8bit_header_decode) + (g_mime_utils_8bit_header_encode) + (g_mime_utils_8bit_header_encode_phrase): Changed all of these + functions to take `const unsigned char *' like they used to. Fixes + bug #423147. + + * gmime/gmime-gpg-context.c (gpg_ctx_new): Initialize flushed and + nodata state variables. Thanks to valgrind for finding these... + + * gmime/gmime-content-type.c + (g_mime_content_type_new_from_string): Shouldn't need to + g_strstrip() the type, is_ttoken() won't match against lwsp + chars. Also, instead of simply scanning past lwsp between some + tokens, use decode_lwsp() between *all* tokens so that we handle + comments as well (not that there should be any...). + + * gmime-2.0.pc.in: Got rid of the redundant @LIBS@ which contained + the same value as @GMIME_LIBS@. + + * configure.in: Added configure checks for large file support. + +2007-03-26 Jeffrey Stedfast + + * gmime-param.c: #include "gmime-parse-utils.h" and got rid of + this file's own decode_lwsp() implementation. + + * internet-address.c: #include "gmime-parse-utils.h" which is + where a bunch of the parser functions have been moved from here. + + * gmime-utils.c: #include "gmime-parse-utils.h" for decode_lwsp() + and decode_domain() + (decode_addrspec): Moved here from internet-address.c which had + been exporting the symbol previously (so that decode_domain didn't + have to be copy/pasted). Now this function can be made static - + yay! No more exporting un-namespaced symbols! + + * gmime/gmime-message.c: #include "gmime-parse-utils.h" for + decode_lwsp() + + * gmime/gmime-parse-utils.[c,h]: New source files containing some + parse utility functions that had been copy/pasted between several + source files previously. + +2007-03-25 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.5 + +2007-03-25 Jeffrey Stedfast + + * tests/Makefile.am (local-check): Simplified. + + * tests/test-streams.c: Generate our own test data if we aren't + given any. + + * tests/test-cat.c: Updated for the new Makefile.am rule. + + * gmime/gmime-stream-mmap.c (stream_length): Fixed to return the + correct length when bound_end == -1 but bound_start != 0. + Discovered this thanks to my new testsuite. + + * gmime/internet-address.c (decode_mailbox): If we can't find a + local-part and inptr is ',', set *in = inptr; rather than *in = + inptr + 1; Discovered this bug thanks to my new testsuite. + + * tests/test-mime.c: Rewritten to use testsuite library. + +2007-03-24 Jeffrey Stedfast + + * tests/Makefile.am (check-local): Rewritten to actually run the + automated tests. + + * tests/test-mbox.c: Rewritten to use testsuite library. + + * tests/test-pgp.c: Rewritten to use testsuite library. + + * tests/test-pgpmime.c: Rewritten to use testsuite library. + + * tests/test-cat.c: Rewritten to use testsuite library. + + * tests/test-streams.c: Rewritten to use testsuite library. + + * tests/test-iconv.c: Rewritten to use testsuite library. + + * tests/testsuite.[c,h]: New automated test-suite helper library. + +2007-03-20 Jeffrey Stedfast + + * configure.in: Check for the existance of _timezone and nfds_t. + + * gmime/gmime-utils.c (mktime_utc): Use _timezone if + HAVE__TIMEZONE is set. + + * gmime/gmime.c (g_mime_init): If HAVE_TIMEZONE or HAVE__TIMEZONE + is set, call tzset() to initialise the timezone variable. + +2007-03-12 Jeffrey Stedfast + + * gmime/gmime-param.c (decode_param): Instead of only checking + that the param value begins with "=?", check if that sequence + exists anywhere in the value. Fixes bug #407522. + + * src/uudecode.c (uudecode): Use a strcmp instead of comparing + against a string literal (which was technically correct in this + case, but the prettyification would be nice if "-" was specified + in argv too). Fixes bug #408613. + +2007-03-10 Jeffrey Stedfast + + * gmime/gmime-message.c (g_mime_message_get_all_recipients): New + convenience function to get To, Cc, and Bcc recipients all in a + single list. + +2007-02-19 Jeffrey Stedfast + + * gmime/gmime-message.h: Moved g_mime_message_get_body() into the + deprecated block. + +2007-02-11 Jeffrey Stedfast + + * gmime/gmime-utils.c: Removed the need for the ctype isblank() + function. + + * gmime/gmime-param.c (decode_int): Need to use (unsigned char *) + when passing indexes to ctype functions. + +2007-02-10 Jeffrey Stedfast + + * gmime/gmime-charset.c: Changed the names of the charset format + macros to coincide with the new names output by iconv-charset.c. + (g_mime_charset_iconv_name): Use the new macro names. + + * iconv-detect.c: Use %u instead of %d, also changed the names of + the format #defines that we print out. + + * gmime/gmime-utils.c (g_mime_utils_quote_string): Optimise a + smidgen. + (g_mime_utils_unquote_string): Fixed, this wasn't working right... + +2007-02-09 Jeffrey Stedfast + + * gmime/gmime-stream-filter.c (stream_write): Instead of comparing + the return value of the source stream write() to our input length + to write, compare to -1. We can't assume the the value the source + stream will return will be what we expected, all we can do is + check for error. + + * gmime/gmime-part.c: Same as below. + + * gmime/gmime-filter-basic.c: Fixes to signedness compile warnings + and updated to reflect gmime-utils.h changes. + + * gmime/gmime-multipart.c (multipart_set_boundary): Updated to + reflect gmime-utils.h changes. + + * gmime/gmime-stream.c (g_mime_stream_writev): If any of the + writes fail, return -1. + + * gmime/gmime-utils.c: header_encode_*() and header_decode_*() now + take const char * rather than const unsigned char * + arguments. This has been done in an effort to fix compile warnings + about signed vs unsigned char * pointers. The 'save' argument to + all of the stream encoders/decoders have been changed to a + guint32, again for signed vs unsigned warning fixes. + +2007-02-08 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.4 + +2007-02-06 Jeffrey Stedfast + + Fix for bug #394433 + + * configure.in: Detect if the system has GNU's getopt + implementation available for us to use. + + * Makefile.am: Don't build our own copy of the GNU getopt library + if the system has it available. + + * src/uuencode.c: If the system has getopt.h, use it instead of + our own getopt.h. + + * src/uudecode.c: If the system has getopt.h, use it instead of + our own getopt.h. + +2007-02-06 Jeffrey Stedfast + + More fixes on account of my test suite... + + * tests/test-cat.c (test_cat_substream): end = start + random + amount... duh. Fixes a bug where sometimes the end bound was < the + start bound. + + * gmime/gmime-stream-cat.c (stream_substream): Calculate the + length of each of the source streams correctly. D'oh. + (stream_substream): Fixed the calculation for s->start. + (stream_substream): Fixed the s->end calculation for when end + within the source stream's bounds. + (stream_substream): Keep track of how long our substream is going + to be for use with setting absolute bound_end on a multi-stream + substream. + +2007-02-05 Jeffrey Stedfast + + Fixes on account of the awesome test suite I wrote earlier... still + need to fix ::substream() tho (or maybe it's just the test that's + broke?). + + * gmime/gmime-stream-cat.c: Added an id member to struct + _cat_node, for use with debugging... + (stream_read): Seek in the source stream, don't call + Cat::stream_seek() to do it. + (stream_seek): Swapped the logic of the "within bounds" check, had + it backwards. When seeking past a stream, set the node->position + to the length of the stream (technically, it's like we read() thru + all that data, right?). Instead of resetting all streams starting + at n->next, reset them all starting at current->next... since 'n' + technically might be before 'current'. + (g_mime_stream_cat_add_source): Assign each node an id for easier + debugging... + +2007-02-05 Jeffrey Stedfast + + * tests/test-cat.c: The beginnings of a test suite for + GMimeStreamCat. + + * gmime/gmime-stream-cat.c (stream_read): Go to the next stream if + nread <= 0, not just nread == 0. + +2007-02-04 Jeffrey Stedfast + + * gmime/gmime-stream-mem.c (stream_reset): No longer need to + update stream->position. + + * gmime/gmime-stream-mmap.c (stream_reset): Same g_return_if_fail + change. Also don't update stream->position. + (stream_seek): Added similar sanity checking/eos resetting as + StreamFs code. + + * gmime/gmime-stream-file.c (stream_read): Style changes. + (stream_write): Style changes. + (stream_close): Fixed compiler warning. + (stream_reset): Changed g_return_if_fail to a true if-then. + (stream_seek): Changed to mimic the StreamFs changes. + (g_mime_stream_file_new): Similar to fs_new() change. + + * gmime/gmime-stream-fs.c (stream_close): Loop the close() + ourselves. + (stream_reset): Changed g_return_if_fail to a true if-then. Also + be better about resetting eos. + (stream_seek): Rewritten to be more correct/robust (at least I + hope). Also properly reset eos when appropriate. + (g_mime_stream_fs_new): If lseek() fails, pretend start offset is + 0. + + * gmime/gmime-stream.c (stream_reset): No longer needs to update + stream->position. + (g_mime_stream_reset): Update stream->position if everything reset + smoothly. This is just a convenience change to subclass + implementations. + + * gmime/gmime-stream-cat.c (stream_read): Rewritten. Hopefully + correct now? Ugh. We can hope... + (stream_write): Fixed to work better. + (stream_close): Rewritten. + (stream_reset): Rewritten to reset the streams, don't seek. + (stream_seek): Rewritten... still not correct, but should be ok + assuming our bound_start is 0. + (stream_length): Rewritten to not depend on a pre-calculated + length value... this Does Not Work (tm) if the source streams are + unbound and we've written to them. + (stream_substream): Rewritten... because ::seek() is so complex + for this type of stream, I've tried to eliminate a lot of the + headaches by making substreams only slurp up the streams within + the bounds of the start/end requested. If the entire contents + within the requested bounds are contained within a single source + stream, we return a substream of said source stream instead. + (g_mime_stream_cat_add_source): Don't precalculate the length here + anymore. + + * gmime/gmime-stream-buffer.c (stream_read): Fixed to never allow + buflen to be negative if the read() of our source stream fails. + (stream_close): Handle the case where we've already been closed. + (stream_eos): Simplified. + (stream_reset): Stylistic changes. + (stream_seek): Don't allow seeks under our bound_start. + +2007-02-03 Jeffrey Stedfast + + * gmime/gmime-stream-cat.c (stream_flush): Flush all streams up to + and including the current stream, not just the current stream. + (stream_write): break if we don't write any data to + current->stream or get an error so we can try the next stream. + + * gmime/gmime-stream-file.c (stream_close): Same as below. + + * gmime/gmime-stream-fs.c (stream_close): Allow closing multiple + times... makes this consistant with the other streams. + (stream_write): If a system write fails with EFBIG or ENOSPC, set + eos to TRUE. + +2007-01-20 Jeffrey Stedfast + + * tests/test-streams.c (test_stream_gets): printf formatter fixes. + + * examples/imap-example.c: #include , fixes bug + #394434. + +2007-01-20 Jeffrey Stedfast + + Fixes bug #394419 + + * gmime/gmime-filter-charset.c (filter_filter): Do iconv const + casting. + (filter_complete): Same. + +2006-11-02 Jeffrey Stedfast + + * gmime/gmime-utils.c (g_mime_utils_header_format_date): Changed + the names of the parameters to date and tz_offset to prevent + warnings from -Wshadow. + + * gmime/gmime-filter-html.c (writeln): Fixed another possible + buffer overflow condition pointed out by hpj. + + * gmime/gmime-filter-crlf.c (filter_filter): Fixed a possible + buffer overflow condition pointed out by hpj. + + * gmime/gmime-gpg-context.c (gpg_ctx_op_step): Modified to use + poll() rather than select() + +2006-09-18 Joe Shaw + + * mono/Makefile.am: Use SOURCES_XML instead of XML_SOURCES to + specify the sources.xml file. XML_SOURCES breaks with newer + automakes. + +2006-08-29 Pawel Salek + + * gmime/gmime-message-partial.c: set buf just before use - since + the mem stream buffer may get reallocated in the meantime leading + to segfaults. + +2006-08-29 Jeffrey Stedfast + + * gmime/gmime-param.c (decode_quoted_string): Unescape escape + sequences. Fixes bug #352771. + + * gmime/gmime-message.c (g_mime_message_set_subject): Updated the + docs. + (g_mime_message_get_subject): Same. + +2006-08-21 Peter Bloomfield + + * gmime/gmime-utils.c (g_mime_utils_unquote_string): handle an + arbitrary sequence of quoted and unquoted sections. + +2006-08-02 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.3 + + * gmime/gmime-message.c (process_header): Decode the values for + Subject, From, Reply-To so that g_mime_message_get_subject/etc all + return decoded strings like they were meant to. + +2006-06-23 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (swrite): Use g_build_filename() and + g_get_tmp_dir() rather than hard-coding the tmpfile to be in /tmp. + +2006-06-23 Jeffrey Stedfast + + * gmime/gmime-part.c: Use g_ascii_* versions of str[n]casecmp. + + * gmime/gmime-parser.c: Use g_ascii_* versions of str[n]casecmp. + + * gmime/gmime-param.c: Use g_ascii_* versions of str[n]casecmp. + + * gmime/gmime-multipart-signed.c: Use g_ascii_* versions of + str[n]casecmp. + + * gmime/gmime-multipart-encrypted.c: Use g_ascii_* versions of + str[n]casecmp. + + * gmime/gmime-multipart.c: Use g_ascii_* versions of + str[n]casecmp. + + * gmime/gmime-message-partial.c: Use g_ascii_* versions of + str[n]casecmp. + + * gmime/gmime-message-part.c: Use g_ascii_* versions of + str[n]casecmp. + + * gmime/gmime-message.c: Use g_ascii_* versions of str[n]casecmp. + + * gmime/gmime-iconv.c (g_mime_iconv_open): Use g_ascii_* versions + of str[n]casecmp. + + * gmime/gmime-header.c (g_mime_header_new): Use + g_mime_strcase_[hash,equal] rather than param_[hash,equal] to + reuse code. + + * gmime/gmime-gpg-context.c: Use g_ascii_* versions of + str[n]casecmp. + + * gmime/gmime-filter-enriched.c: Use g_ascii_* versions of + str[n]casecmp. + + * gmime/gmime-disposition.c (g_mime_disposition_add_parameter): + Use g_mime_strcase_[hash,equal] rather than param_[hash,equal] to + reuse code. + (g_mime_disposition_new): Same. + (param_equal): Removed. + (param_hash): Removed. + + * gmime/gmime-content-type.c: Use g_ascii_* versions of + str[n]casecmp. + (g_mime_content_type_new_from_string): Use + g_mime_strcase_[hash,equal] rather than param_[hash,equal] to + reuse code. + (g_mime_content_type_set_parameter): Same. + (param_equal): Removed. + (param_hash): Removed. + + * gmime/gmime-charset.c: Use g_ascii_* versions of str[n]casecmp. + +2006-06-23 Jeffrey Stedfast + + * gmime/gmime-stream-cat.c (stream_seek): Fixed to only seek if + necessary and also to use ::reset() if seeking back to the + beginning of the stream so that it works for non-seekable streams + too. Fixes bug #345503 - again thanks to Charles for reporting + this bug. + + * gmime/gmime-object.c (subtype_bucket_foreach): Fixed to also + free the bucket memory. Fixes bug #345768, thanks to Charles Kerr + for pointing this out. + +2006-06-22 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c: Removed #define _POSIX_SOURCE to fix + bug #172179. + +2006-06-15 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.2 + +2006-06-01 Jeffrey Stedfast + + * gmime/gmime-utils.c (parse_broken_date): Fixed to handle + MM-DD-YY properly and also to fallback to DD-MM-YY if the first + pair of digits isn't within range for a proper month. + +2006-05-30 Jeffrey Stedfast + + * gmime.h.in: Removed. + + * gmime.h: Now static, no longer auto-generated. + + * gmime/gmime.c: Set the gmime_[major,minor,micro]_version + variables. + (g_mime_check_version): New function to check the required + version. + + * gmime/gmime-stream-fs.c: Implement our own no-op version of + fsync() for systems that don't have fsync(). + +2006-05-24 Jeffrey Stedfast + + * examples/imap-example.c (main): Use g_mkdir() to make this + example portable to Win32. + +2006-05-01 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Handle prompts + from GnuPG asking for the user's PIN for their SmartCard. + +2006-04-21 Jeffrey Stedfast + + * gmime/gmime-stream.h: #include for SEEK_SET/CUR/END + enum values. + +2006-03-16 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.1 + + * gmime/gmime-parser.c (parser_step): No-op if we are in an ERROR + state. + (parser_construct_message): Don't bail if we don't start in state + INIT, this is valid. + (parser_step_from): We need to bail even if parser_fill() returns + > 0 if the line is incomplete (e.g. a forced refill was needed but + no additional data could be read). + +2006-03-16 Jeffrey Stedfast + + * README: Bumped version + + * configure.in: Bumped version to 2.2.0, it's about time I made a + stable release. + +2006-03-15 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_step_from): If we fail to find a + From line, set an error state. Also fixed the End-Of-Data check to + prevent an infinite loop if the stream ends with \n\n. + (parser_construct_message): Make sure our state starts off at + INIT. Also check for the ERROR state in our parser_step() loop and + return NULL if we encounter an error. + +2006-03-03 Jeffrey Stedfast + + * util/url-scanner.c (g_url_web_end): Allow urls such as + "http://www.novell.com./path" (note the '.' before the path + component). + (g_url_addrspec_start): If the '@' is the first character in the + match, then it isn't a valid email address. + +2006-01-12 Jeffrey Stedfast + + * configure.in: Bumped version to 2.1.19 + +2006-01-19 Joe Shaw + + * mono/DataWrapper.custom: We need to manually create a decoding + filtering stream and wrap that in a StreamWrapper rather than the + DataWrapper's GMimeStream directly, which contains undecoded data. + + * mono/GMime.metadata: Rename some enum members, add DataWrapper's + GMimeStream property and MimePart's ContentObject properties as + items which return an owned ref. + +2006-01-12 Jeffrey Stedfast + + ** made a release of 2.1.18 ** + + * gmime/gmime-stream-mem.c (g_mime_stream_mem_get_byte_array): Use + g_return_val_if_fail() rather than g_return_if_fail() since we + need to return NULL on error. + +2006-01-09 Joe Shaw + + * mono/Message.custom: Add a References property. Based on a + patch from D Bera + +2006-01-05 Joe Shaw + + * configure.in: Require gtk-sharp 2.4.0. Set the mono API version + to ..0., which initially is set to + 2.1.0.0, so that version numbers are handled better with gmime + upgrades (and hopefully RPM deps on most distros). Bump version + to 2.1.18. + + * README: Updated version + + * gmime/gmime-stream-mem.[ch]: Add a + g_mime_stream_mem_get_byte_array() method for the mono bindings. + + * mono/DataWrapper.custom: + * mono/Header.custom: + * mono/Object.custom: Remove WriteToStream() and replace with a + new Stream property which returns a wrapped gmime memory stream. + + * mono/GMime.metadata: A bunch of metadata fixes, mainly for + 64-bit compatibility. gtk-sharp incorrectly maps off_t to size_t, + which is an int; it's actually a long, so map it manually + ourselves. + + * mono/ObjectStream.cs: Remove this; it's been replaced by + StreamWrapper, which is much more memory efficient. + + * mono/Stream.custom: Seek() returns a long. Remove the + CopyToStream() and WriteToStream() methods, since streams can now + just be wrapped with a StreamWrapper. Implement the Read() + method, and return a long. + + * mono/StreamWrapper.cs: Added. Wraps a GMime.Stream in a + System.IO.Stream. + + * mono/gmime-api.raw: Regenerated. + +2005-11-14 Jeffrey Stedfast + + * gmime/gmime-utils.c (g_mime_references_next): Added for the C# + bindings. + +2005-10-12 Jeffrey Stedfast + + * README: Updated version + + * configure.in: Bumped version to 2.1.17 + + * gmime/gmime-message.c (message_get_header): For added + convenience, if the requested header is a Content-* header and a + top-level MIME part exists, query for the requested header on the + top-level MIME part and return the value. + + * gmime/gmime-parser.c (parser_step_headers): If we weren't able + to find the end of the header, save it to our tmp buff before + refilling our input buffer and set midline to TRUE. No need to + check inptr < inend later because we know it to be true. + (parser_step_headers): Append the raw header leftovers in the + parser_fill() failure case. + +2005-09-27 Jeffrey Stedfast + + * gmime/gmime-message-partial.c + (g_mime_message_partial_split_message): Reworked the splitting + logic to try and split on whole-lines. + + * gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify): + Return NULL if the number of parts is incorrect. + +2005-09-20 Jeffrey Stedfast + + * gmime/gmime-message-partial.c (header_copy): Only set the value + if the value is non-NULL. Thanks to Peter Bloomfield for this fix. + +2005-08-18 Jeffrey Stedfast + + * README: Updated version + + * configure.in: Bumped version to 2.1.16 + +2005-08-18 Joe Shaw + + * mono/Makefile.am: Install gmime-api.xml into gapi-2.0 + +2005-08-17 Joe Shaw + + * configure.in: Require gtk-sharp 2 for the mono bindings. + + * mono/GMime.metadata: Rename a few items that the gtk-sharp 2 + parser added. + + * mono/gmime-api.raw: Regengerate this using the gtk-sharp 2 + parser. + +2005-08-16 Joe Shaw + + * mono/Makefile.am: libexecdir isn't right; we should be using + $prefix/lib instead. + +2005-07-12 Jeffrey Stedfast + + * mono/Makefile.am: libexecdir fixes by Stanislav + + * gmime/internet-address.c: Fixes to various functions that used + incorrect g_return*_if_fail variants. Thanks to sbrabec@suse.cz + +2005-06-23 Jeffrey Stedfast + + * gmime/gmime-utils.c (g_mime_utils_header_decode_date): Handle + the case where the number of tokens returned from datetok is 0 + which can happen if broken software sends an empty Date: header. + +2005-06-13 Jeffrey Stedfast + + * README: Updated + + * configure.in: Bumped version to 2.1.15 + + * gmime/gmime-parser.c (parser_step_headers): Don't check + inptr[-1] unless inptr > start + +2005-06-10 Joe Shaw + + * mono/Stream.custom (CopyToStream): Check to see if + byte_array.data is IntPtr.Zero and don't try to copy if it is. + +2005-06-10 Joe Shaw + + * mono/DataWrapper.custom: Added. Adds a WriteToStream() overload + which takes a System.IO.Stream. + + * mono/Header.custom: Ditto. + + * mono/Makefile.am: Add DataWrapper.custom and Header.custom to + customs. + + * mono/Object.custom: Remove the GetData() method... it was rather + flawed. WriteToStream() is the right way to go about it now. Add + a WriteToStream() overload like DataWrapper and Header. + + * mono/Stream.custom: Add an internal CopyToStream() method which + instantiates a GMime.StreamMem, calls WriteToStream() on it, and + then copies the data from the GByteArray into a System.IO.Stream. + Also add a WriteToStream() overload like the others. + +2005-05-25 Joe Shaw + + * mono/GMime.metdata: Add a few extra rules since the + parser/generator changed how certain types are represented. + + * mono/InternetAddress.custom: Remove this file, move the code to... + + * mono/InternetAddressList.cs: ... this file, making it a + first-order object. Since it implements IDisposable and people + might want to explicitly dispose it. + + * mono/Message.custom (GetRecipients): Return an + InternetAddressList rather than an ICollection, so people can + dispose when finished. Also have it always return a valid + InternetAddressList, so you don't have to do a null check before a + foreach. + + * mono/Makefile.am: Remove InternetAddress.custom from customs and + add InternetAddressList.cs to sources. + +2005-05-25 Joe Shaw + + * gmime/internet-address.c: Add accessor functions + internet_address_get_type(), internet_address_get_name(), + internet_address_get_addr() and internet_address_get_members() for + binding into the Mono bindings. + + * mono/GMime.metadata: Work around an automatic rename of the + gtk-sharp generator of a method named "GetType" to a property + named "GType," since this method doesn't return a GType. Rename + it to "GetAddressType" which is mapped to an "AddressType" + property. + + * mono/gmime-api.raw: Regenerated. + +2005-05-20 Jeffrey Stedfast + + * gmime/gmime-utils.c (header_fold): Eat up extraneous whitespace + after forcing a fold. + +2005-03-30 Tim Mooney + + * tests/test-stream.c: include , so we can use G_GNUC_FUNCTION + and therefore compile with non-gcc compilers. + +2005-04-14 Jeffrey Stedfast + + * configure.in: Applied patch from + mooney@dogbert.cc.ndsu.nodak.edu to not assume that mcs was GNU + Mono and to instead verify that it was. Fixes bug #172175. + +2005-03-29 Jeffrey Stedfast + + * README: Updated. + + * configure.in: Bumped version to 2.1.14 + + * gmime/gmime-parser.c (parser_step_headers): If we didn't find + EOL for a header, set state based on 'inptr' rather than + 'start'. Fixes a bug parsing headers that cross read boundaries + (and where headers are longer than the internal read-ahead buffer + size). + +2005-03-23 Joe Shaw + + * configure.in: Require gtk-sharp >= 1.0.6 for important + memory leak fixes + +2005-03-15 Joe Shaw + + * mono/Makefile.am: Build ObjectStream.cs + + * mono/ObjectStream.cs: Added. Implements a .net Stream for + getting the conents from a GMime.Object. + +2005-03-12 Joe Shaw + + * mono/GMime.metadata: Tag the return values of + MessagePart.Message, Message.MimePart, Multipart.GetPart() and + Multipart.GetSubpartFromContentId() as "owned", meaning that + gtk-sharp should not ref them but take ownership of the single + reference that's returned from the underlying C functions. + + * mono/Message.custom: Don't instantiate InternetAddress + objects, just deal with the C APIs directly. This saves us a + lot of allocations and fixes a bug in gtk-sharp where opaque + objects would leak references. + +2005-03-07 Jeffrey Stedfast + + * gmime/gmime-header.c (g_mime_header_prepend): New function to + prepend a header to the list. + +2005-03-07 Jeffrey Stedfast + + * README: Updated. + + * configure.in: Bumped version to 2.1.13 + + * gmime/gmime-charset.c (g_mime_charset_step): Don't bother with + MAX() for cases where we'll just end up setting level to 2. + +2005-03-07 Joe Shaw + + * mono/GMime.metadata: Add the "owned" flag to the return + value parameter for ConstructMessage on the GMimeParser, + because this method returns a new object with a refcount + of 1. The binding needs to take ownership of the object. + +2005-02-14 Jeffrey Stedfast + + * README: Updated + + * configure.in: Bumped version to 2.1.12 + +2005-01-31 Jeffrey Stedfast + + * gmime/gmime-utils.c (header_fold): Don't break apart rfc2047 + encoded tokens. + +2005-01-18 Jeffrey Stedfast + + * README: Updated + + * configure.in: Bumped version to 2.1.11 + +2005-01-26 Joe Shaw + + * mono/GMime.metdata: The gtk-sharp generator doesn't handle + "const unsigned char *" well, so override those methods in + metadata. + +2005-01-20 Jeffrey Stedfast + + * gmime/gmime-param.c (param_list_format): If folding mode is + enabled, terminate the header with a \n. + +2005-01-19 Jeffrey Stedfast + + * gmime/gmime-part.c (g_mime_part_init): Register a writer for + Content-Disposition. + + * gmime/gmime-object.c (g_mime_object_init): Register a new writer + func for Content-Type headers so that we don't accidently fold in + the middle of a parameter value. + +2005-01-13 Joe Shaw + + * autogen.sh: Allow automake 1.9 + +2005-01-11 Jeffrey Stedfast + + * README: Updated + + * configure.in: Bumped version to 2.1.10 + +2004-12-10 Jeffrey Stedfast + + * gmime/internet-address.c (internet_address_to_string): rfc2047 + encode the group name too. + +2004-12-08 Jeffrey Stedfast + + * gmime/gmime-content-type.c (g_mime_content_type_is_type): Fixed + to do as advertised - allow wildcard matching for type. + +2004-12-06 Joe Shaw + + * mono/Makefile.am: Add InternetAddress.custom + + * mono/InternetAddress.custom: Added. Implements a new class + which will handle the destroying of InternetAddressLists. + Implement ParseString, which basically implements a managed + version of internet_address_parse_string. + + * mono/Message.custom: Use the InternetAddressList for + GetRecipients (). + +2004-12-01 Joe Shaw + + * configure.in: Error out if the user explicitly enables the mono + bindings and we can't find mcs. + + * gmime.spec.in: Add support for the mono bindings, placing them + in a separate gmime-sharp package. Patch from Ryan Skadberg + + +2004-11-29 Joe Shaw + + * mono/AssemblyInfo.cs.in: Add @srcdir@ to AssemblyKeyFile so we + build when builddir != srcdir. + + * mono/Makefile.am: Add gmime-sharp.pub to EXTRA_DIST. + +2004-11-27 Jeffrey Stedfast + + * gmime/gmime-gpg-context.c: #define _POSIX_SOURCE so it compiles + on IRIX. + + * gmime/gmime-multipart-signed.c (multipart_signed_remove_header): + Same. + + * gmime/gmime-multipart-encrypted.c + (multipart_encrypted_remove_header): Don't return. + +2004-11-19 Joe Shaw + + * mono/GMime.metadata: Don't autogenerate get GetDate method + + * mono/Message.custom: Implement it by hand and return a DateTime. + +2004-11-17 Joe Shaw + + * mono/GMime.metadata: More metadata goodness. + + * mono/Makefile.am: Added Object.custom and Stream.custom. + + * mono/Object.custom: Add a GetData() method which returns a byte + array of the object's data. + + * mono/Stream.custom: Add a wrapper around Seek() so that you + don't need to specify whence. + +2004-11-16 Joe Shaw + + * configure.in: Generate mono/gmime-sharp.pc. + + * mono/GMime.metadata: Convert all ssize_t and off_t values to + ints in C#, since they're not automatically handled by the + generator right now. + + * mono/Makefile.am: Install the gmime-sharp stuff as gmime-sharp + and not gmime. + + * mono/gmime-sharp.pc.in: Added. pkgconfig file for the mono + bindings. + +2004-11-16 Joe Shaw + + * Makefile.am: iconv-detect.h should be in DISTCLEANFILES, not + CLEANFILES, or else the build fails following a "make clean" + unless you re-autogen. + + * gmime/internet-address.[ch]: Added functions + internet_address_list_next() and + internet_address_list_get_address() since we can't poke at the + structures by hand in mono. + + * mono/GMime.metadata: Remove a bunch of commented out stuff, hide + the entire InternetAddressList structure. We'd prefer to do it + with .net datatypes. + + * mono/Message.custom: Added. Adds a GetRecipients() method which + returns an ICollection of InternetAddresses, and a + GetRecipientsAsString() method which returns a stringified list + for pretty printing. + + * mono/gmime-api.raw: Regenerate this for the new + InternetAddress.GetAddress() and Next() methods. + +2004-11-15 Joe Shaw + + * Added a mono binding + + * configure.in: Add optional checks for mono and gtk-sharp. + + * Makefile.am: Build the mono subdir if enabled. + + * gmime/Makefile.am: Add $(GLIB_LIBS) to the libgmime LIBADD line. + + * gmime/*.h: Replace GMIME_CHECK macros with the G_TYPE_CHECK + ones, because the gtk-sharp binding generator looks for them. + + * gmime/gmime-type-utils.h: Removed. + + * mono/AssemblyInfo.cs.in: Added. + + * mono/sources.xml: Added. The sources file, which tells the + generator how to generate the API data. + + * mono/GMime.metadata: Added. Metadata file used to tweak the + generated API. + + * mono/Global.custom: Added. The g_mime_init() function isn't + being wrapped automatically for some reason, so add the code here. + + * mono/gmime-api.raw: Added. The raw generated API, so that the + parser doesn't have to be run by most people. + + * mono/gmime-sharp.pub: Added. Public key used to sign the + assembly. + +2004-10-22 Jeffrey Stedfast + + * configure.in: Removed the --enable-ipv6 option. getaddrinfo is + now the only way hostname resolution is done. Added checks to see + if getaddrinfo requires -lsocket for Solaris boxen. + + * gmime/gmime-host-utils.[c,h]: Removed + + * gmime/gmime.h.in: Removed gmime-host-utils.h + + * gmime/gmime-utils.c (g_mime_utils_generate_message_id): Use + getaddrinfo to resolve hostnames, don't bother with the + gethostbyname() variants. Makes this code simpler and allows us to + get rid of gmime-host-utils.[c,h]. + +2004-10-01 Jeffrey Stedfast + + * README: Updated + + * configure.in: Bumped version to 2.1.9 + +2004-09-29 Jeffrey Stedfast + + * gmime/gmime-parser.c (parser_step_headers): Save the entire raw + part header as well. + (parser_init): Init the rawbuf (will be used for holding the raw + part header). + (parser_close): Free the rawbuf. + (parser_construct_leaf_part): Set the raw header on the mime part. + (parser_construct_multipart): Set the raw header on the multipart. + (parser_construct_message): Don't use g_mime_message_set_mime_part + or we'll end up clearing the raw header that we worked so hard to + preserve. + (parser_scan_message_part): Same. + (parser_scan_multipart_face): Change comparison to >= so that we + actually get rid of the last crlf sequence like we meant to. + (parser_fill): Get rid of the atleast check (it isn't really + needed and can cause breakage). + + * gmime/gmime-message.c (message_get_headers): Modified to only + write part headers if the toplevel mime part contains the raw + header. + (message_write_to_stream): Same. + (g_mime_message_set_mime_part): Clear the raw message headers + since it obviously won't contain the raw message headers. + (message_add_header): If any message headers change, clear the raw + header from the toplebel mime part. + (message_set_header): Same. + + * gmime/gmime-header.c (g_mime_header_set_raw): New function to + set the raw part header (to be used in place of our own folding if + available). + (g_mime_header_has_raw): New function to check if the raw header + is available. + +2004-09-28 Peter Bloomfield + + * gmime/gmime-multipart-signed.c (sign_prepare): Must treat + multipart/signed and multipart/encrypetd parts as opaque + (e.g. don't even attempt to change their encodings). + +2004-09-13 Jeffrey Stedfast + + * gmime/gmime-message.c (write_addrspec): New folding callback to + use on addrspec headers. + (g_mime_message_init): Register write_addrspec for all address + headers. + + * gmime/gmime-utils.c (header_fold): Fixed the logic a bit for + structured headers such that we don't break long tokens. + +2004-08-22 Jeffrey Stedfast + + * README: Updated. + + * configure.in: Bumped the version to 2.1.8 + + * gmime/gmime.h.in: #include for + ia64 build fix on Debian (required because of the way gtk-doc's + scan program works). + + * gmime/gmime-filter-enriched.c (enriched_to_html): Don't replace + with
. Also, replace lone '\n's with a space as
+	suggested by rfc1896.
+
+2004-08-08  Jeffrey Stedfast  
+
+	* gmime/gmime-multipart-encrypted.c
+	(g_mime_multipart_encrypted_encrypt): Don't set encrypted.asc as
+	the filename anymore.
+
+	* gmime/gmime-multipart-signed.c (g_mime_multipart_signed_sign):
+	Added a hack for Balsa so it can support S/MIME. Also don't set
+	the filename to signature.asc. Balsa maintainers don't want this
+	*shrug*.
+	(g_mime_multipart_signed_verify): Same. These changes really
+	require a design change to CipherContext but that'll have to wait.
+
+2004-08-04  Jeffrey Stedfast  
+
+	* configure.in: Changed the iconv-detect logic to not error-out on
+	fail. The code can properly handle the case where iconv-detect.h
+	doesn't exist, so let it do that instead.
+
+2004-07-30  Jeffrey Stedfast  
+
+	* gmime/gmime-utils.c (rfc2047_encode_get_rfc822_words): Don't use
+	g_unichar_isspace() here, we only want to break 'words' on ascii
+	lwsp.
+
+2004-07-16  Jeffrey Stedfast  
+
+	* gmime/gmime.c (g_mime_init): Make intialisation ref-counted.
+	(g_mime_shutdown): Updated.
+
+2004-07-06  Jeffrey Stedfast  
+
+	* gmime/gmime-utils.c (rfc2047_encode_get_rfc822_words): Break
+	apart long words so that they we don't generate encoded-word
+	tokens that are >75 chars. Fixes bug #145497.
+
+2004-07-04  Jeffrey Stedfast  
+
+	* README: Updated.
+
+	* configure.in: Bumped the version to 2.1.7
+
+	* gmime/gmime-parser.c (parser_construct_leaf_part): Removed code
+	to check that the content_type argument is NULL - it can never be
+	NULL.
+	(parser_scan_multipart_face): Fixed a possible buffer-overrun.
+
+	* gmime/gmime-object.c (process_header): Modified to call
+	g_mime_object_set_content_type() if we got called with a
+	Content-Type header. This way all the ::set_content_type()
+	subclass methods get a chance to update the object's state.
+	(process_header): Return TRUE if we've "processed" the value or
+	FALSE otherwise.
+	(add_header): Only add the header if process_header() didn't do
+	anything with the header.
+	(set_header): Same.
+
+	* gmime/gmime-message.c (g_mime_message_set_sender): Parse the
+	sender string so we can properly encode it before setting it as
+	the From header.
+
+2004-06-28  Jeffrey Stedfast  
+
+	* gmime/gmime-parser.c (parser_scan_content): Updated to handle
+	crlf sequences.
+	(parser_scan_mime_part_content): Same.
+	(crlf2lf): New function to convert CRLF to LF.
+	(parser_scan_multipart_face): Convert the pre/postface into lf
+	format.
+
+2004-06-27  Jeffrey Stedfast  
+
+	* util/url-scanner.c (g_url_web_end): Some fixes that I had to do
+	recently for Camel as well.
+
+2004-06-22  Jeffrey Stedfast  
+
+	* gmime/gmime-parser.c (parser_construct_leaf_part): Only destroy
+	the existing content_type on the object if it is non-NULL.
+	(parser_construct_multipart): Same.
+
+2004-06-15  Jeffrey Stedfast  
+
+	* configure.in: Added --enable-profile option and removed
+	--enable-gprof. --enable-profile enables gprof and gcov.
+
+	* gmime/gmime-parser.c: #include  for strtoul()
+	(parser_construct_leaf_part): Got rid of an unused variable.
+
+	* gmime/gmime-param.c (rfc2184_param_new): Got rid of an unused
+	variable.
+	(rfc2184_decode): Got rid of an unused variable.
+
+	* util/gtrie.c (trie_utf8_getc): Get rid of the unused labels.
+
+2004-06-09  Jeffrey Stedfast  
+
+	* gmime/gmime-stream-filter.c (stream_write): Set flushed to
+	FALSE.
+	(stream_read): Set flushed to FALSE if we end up filtering more
+	data.
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Record the
+	nodata state.
+	(gpg_verify): Check the nodata state.
+
+2004-06-06  Jeffrey Stedfast  
+
+	* README: Updated.
+
+	* configure.in: Bumped version to 2.1.6
+
+	* gmime/gmime-parser.c (parser_construct_multipart): Instead of
+	using g_mime_object_set_content_type(), destroy the current
+	content_type object and set our own on it directly. This prevents
+	the raw Content-Type header value from being overridden by the
+	re-written version from our parsed object.
+	(parser_construct_leaf_part): Same.
+
+	* gmime/gmime-part.c (mime_part_write_to_stream): Don't sync the
+	GMimeDisposition object to the header here anymore. We want to try
+	and keep the original raw header if this is a parsed message.
+
+2004-06-03  Jeffrey Stedfast  
+
+	* gmime/gmime-part.c (sync_content_disposition): Moved. Also
+	protect against a NULL disposition.
+	(mime_part_write_to_stream): Sync the Content-Disposition header
+	before writing to the stream.
+
+	* gmime/gmime-utils.c (header_fold): Fixed a folding bug where we
+	could get a blank line (well, wasn't really blank - but we would
+	get a "\n\t\n" sequence which isn't really useful nor desirable).
+
+	* gmime/gen-table.c: Added a new bit and corresponding macro.
+
+	* gmime/gmime-table-private.h: Updated.
+
+	* gmime/gmime-param.c (encode_param): If conversion into the best
+	charset fails, fall back to using UTF-8. Also use the new
+	convenience macro, is_attrchar(), to decide which characters in
+	the param value to encode.
+	(param_list_format): Use is_attrchar() for calculating how many
+	characters we expect to either have to quote or encode.
+	(decode_param_list): Rewritten.
+
+2004-05-31  Jeffrey Stedfast  
+
+	* gmime/gmime-data-wrapper.c (g_mime_data_wrapper_set_stream):
+	Updated gtk-doc comments to note that you'll probably also want to
+	call g_mime_data_wrapper_set_encoding().
+
+2004-05-26  Jeffrey Stedfast  
+
+	* gmime/gmime-message.c (write_subject): New function. Use
+	unstructured folding rather than the default.
+	(g_mime_message_init): Register the subject header writer.
+
+	* gmime/gmime-utils.c (g_mime_utils_structured_header_fold): New
+	function (same as g_mime_utils_header_fold() but more
+	appropriately named).
+	(g_mime_utils_unstructured_header_fold): Fold unstructured headers
+	like Subject.
+	(header_fold): Moved all of the g_mime_utils_header_fold() logic
+	into here with a small adjustment to differentiate structured vs
+	unstructured header folding.
+
+2004-05-25  Jeffrey Stedfast  
+
+	* gmime/gmime-param.c (param_list_format): Modified to try and
+	squeeze more characters per line and still keep it under 76 chars
+	per line.
+
+2004-05-24  Jeffrey Stedfast  
+
+	* gmime/gmime-filter-gzip.c (g_mime_filter_gzip_finalize): Call
+	inflateEnd/deflateEnd to fix a memory leak.
+
+	* gmime/gmime-parser.c (parser_offset): If priv->offset == -1,
+	don't bother doing any pointer arithmetic as it will result in a
+	value that will break certain code (eg. the boundary matching
+	code).
+
+2004-05-20  Jeffrey Stedfast  
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_new): Remember if our
+	environment is in UTF-8 or not.
+	(gpg_ctx_parse_status): Only convert the user name from the locale
+	charset to UTF-8 if the env isn't UTF-8.
+	(gpg_ctx_parse_status): Convert the password to the locale charset
+	if the locale isn't UTF-8.
+
+2004-05-15  Jeffrey Stedfast  
+
+	* README: Updated.
+
+	* configure.in: Bumped version to 2.1.5
+
+	* gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify):
+	Updated.
+
+	* gmime/gmime-cipher-context.h: Added a new GMimeSignatureValidity
+	which replaces the now deprecated GMimeCipherValidity. Typedef
+	GMimeCipherValidity to GMimeSignatureValidity and wrap deprecated
+	functions with #ifndef GMIME_DISABLE_DEPRECATED.
+
+	* gmime/gmime-cipher-context.c (g_mime_signature_validity_new):
+	New function.
+	(g_mime_signature_validity_free): New.
+	(g_mime_signature_validity_get_status): New.
+	(g_mime_signature_validity_set_status): New.
+	(g_mime_signature_validity_get_details): New.
+	(g_mime_signature_validity_set_details): New.
+	(g_mime_signature_validity_get_signers): New.
+	(g_mime_signature_validity_add_signer): New.
+	(g_mime_cipher_validity_new): Deprecated.
+	(g_mime_cipher_validity_init): Deprecated.
+	(g_mime_cipher_validity_get_valid): Deprecated.
+	(g_mime_cipher_validity_set_valid): Deprecated.
+	(g_mime_cipher_validity_get_description): Deprecated.
+	(g_mime_cipher_validity_set_description): Deprecated.
+	(g_mime_cipher_validity_clear): Deprecated.
+	(g_mime_cipher_validity_free): Deprecated.
+	(g_mime_signer_new): New function
+	(g_mime_signer_free): New function.
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Save more
+	state.
+	(gpg_verify): Updated to fill out the new GMimeSignatureValidity
+	structure with more details.
+
+2004-05-15  Jeffrey Stedfast  
+
+	* gmime/gmime-host-utils.h: Wrap inclusion of netdb.h with G_OS_WIN32
+
+	* util/memchunk.c (memchunk_alloc): Fixed another cast warning on
+	win32.
+
+	* gmime/gmime-message.c (g_mime_message_get_mime_part): New
+	function.
+	(g_mime_message_get_body): Fixed a bug where is_html could get set
+	to TRUE even if the part wasn't html.
+
+2004-05-13  Jeffrey Stedfast  
+
+	* util/memchunk.c (memchunk_alloc): Add parens to fix casting
+	warning on win32.
+
+	* gmime/gmime-message.c (write_received): Rewritten.
+
+2004-05-10  Jeffrey Stedfast  
+
+	* gmime/gmime-filter-gzip.c: New filter for compressing/inflating
+	gzip streams.
+
+2004-05-09  Jeffrey Stedfast  
+
+	* gmime/gmime-message.c (write_received): Be careful to never
+	append bytes beyond the end of the header value (eg the nul byte).
+
+	* gmime/gmime-utils.c (g_mime_utils_header_fold): Don't allow
+	folded headers to end with \n\n.
+
+2004-04-28  Jeffrey Stedfast  
+
+	* gmime/gmime-multipart-encrypted.c
+	(g_mime_multipart_encrypted_decrypt): Reset the stream before
+	trying to parse it.
+
+2004-04-25  Jeffrey Stedfast  
+
+	* gmime/gmime-utils.c (g_mime_utils_header_fold): Rather than
+	always using a tab character when folding, use the lwsp character
+	that we are wrapping at instead.
+
+2004-04-24  Jeffrey Stedfast  
+
+	* gmime/gmime-parser.c (g_mime_parser_init): Initialise
+	respect_content_length.
+
+2004-04-24  Jeffrey Stedfast  
+
+	* README: Updated
+
+	* configure.in: Bumped version to 2.1.4
+
+	* gmime/gmime-part.c (g_mime_part_get_content): Disable debug
+	warning.
+
+	* gmime/gmime-iconv.c: Same.
+
+	* gmime/gmime-iconv-utils.c: Disable warnings.
+
+	* gmime/gmime-utils.c (decode_msgid): Try to always return a
+	string buffer containing whatever we can get from the msg-id, even
+	if it isn't a valid msg-id token.
+
+2004-04-19  Jeffrey Stedfast  
+
+	* gmime/gmime-content-type.c
+	(g_mime_content_type_new_from_string): Chew up lwsp between the
+	end of the subtype and the ';' token, if there is any.
+
+2004-04-13  Jeffrey Stedfast  
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Save both the
+	TRUST_UNDEFINED trust state as well as the whether or not we get a
+	NO_PUBKEY status message.
+
+2004-04-11  Jeffrey Stedfast  
+
+	* gmime/gmime-stream-filter.c (stream_read): Check that we haven't
+	already flushed the stream if the source stream is at EOS - fixes
+	an infinite loop case if the user doesn't use a loop to check
+	eos() each loop.
+
+2004-04-02  Jeffrey Stedfast  
+
+	* gmime/gmime-stream-cat.c (stream_write): This should be writing
+	data, not reading it from the underlying streams. Oops.
+
+2004-03-30  Jeffrey Stedfast  
+
+	* gmime/gmime-charset.c (charset_best_mask): Don't use the charset
+	if it is lang specific and the lang doesn't match the
+	locale. Fixes bug #138218.
+
+	* gmime/gmime-utils.c (mktime_utc): New function to mktime() into
+	UTC.
+	(parse_rfc822_date): Use mktime_utc() instead of doing it
+	ourselves.
+	(parse_broken_date): Same.
+
+2004-03-21  Jeffrey Stedfast  
+
+	* gmime/gmime-stream-buffer.c (stream_write): Fixed a bug when
+	writing across block boundaries.
+
+2004-03-09  Jeffrey Stedfast  
+
+	* gmime/gmime-cipher-context.c (g_mime_cipher_verify): Allow the
+	sigstream to be NULL (it is optional afterall).
+
+	Thanks to Peter Bloomfield for reminding me about
+	g_ascii_strdown() and g_ascii_strup() and for providing the
+	original patch.
+
+	* gmime/gmime-charset.c (locale_parse_lang): Don't use
+	g_ascii_strdown() and g_ascii_strup() as these functions strdup
+	the result rather than working on the input string.
+	(g_mime_charset_map_init): Instead of strdup()ing the charset name
+	and then using g_ascii_strdown(), just use g_ascii_strdown() since
+	it malloc's. Also, even if we have nl_langinfo(), we want to parse
+	LC_ALL to get the locale lang.
+
+2004-03-06  Jeffrey Stedfast  
+
+	* README: Updated
+
+	* configure.in: Bumped version to 2.1.3
+
+2004-02-28  Jeffrey Stedfast  
+
+	* gmime/gmime-stream-buffer.c (stream_write): Shrink buflen down
+	by the number of bytes flushed or we'll loop forever writing the
+	same block over and over.
+
+	* gmime/gmime-strea.[c,h]: Make stream_write() take a const char
+	*buf argument instead of char *buf.
+
+	* gmime/gmime-stream-*.c (stream_write): constify the buf
+	argument.
+
+	* gmime/gmime-stream-null.c (stream_write): Count newlines as
+	well.
+
+2004-02-26  Jeffrey Stedfast  
+
+	* util/*.[c,h]: Moved here from gmime/
+
+	* gmime/*.h: Fixed #includes
+
+	* gmime/cache.[c,h]: Moved to util/
+
+	* gmime/gtrie.[c,h]: Moved to util/
+
+	* gmime/list.[c,h]: Moved to util/
+
+	* gmime/md5-utils.[c,h]: Moved to util/
+
+	* gmime/memchunk.[c,h]: Moved to util/
+
+	* gmime/url-scanner.[c,h]: Moved to util/
+
+	* gmime/gmime-parser.c: Don't use gobject macro casts.
+
+	* gmime/gmime-filter-md5.c: Move the MD5Context into a private
+	structure so that we don't need to install md5-utils.h
+
+2004-02-18  Jeffrey Stedfast  
+
+	* gmime/gmime-utils.c (rfc2047_encode): Return a duplicate of the
+	input string if there are no 'words'.
+
+	* gmime/internet-address.c (internet_address_to_string): Make sure
+	ia->name is not an empty string.
+
+2004-02-13  Jeffrey Stedfast  
+
+	* gmime/gmime-parser.c (parser_construct_multipart): Pop our end
+	boundary before scanning postface text data. Prevents a hang if a
+	multipart brokenly has 2 end boundaries.
+
+2004-02-08  Jeffrey Stedfast  
+
+	* gmime/*.c: Use g_object_ref/unref instead of the
+	g_mime_object_ref/unref and g_mime_stream_ref/unref.
+
+2004-02-08  Jeffrey Stedfast  
+
+	* gmime/gmime-utils.c (rfc2047_encode): Changed to take a safemask
+	arg instead of a gboolean phrase arg since we never used 'phrase'
+	directly.
+	(g_mime_utils_header_encode_phrase): Pass IS_PSAFE as second
+	argument.
+	(g_mime_utils_header_encode_text): Pass IS_ESAFE as second
+	argument.
+
+2004-02-07  Jeffrey Stedfast  
+
+	* README: Updated.
+
+	* configure.in: Bumped version to 2.1.2
+
+	* examples/README: New README explaining the purpose of each of
+	the example sources.
+
+2004-02-06  Jeffrey Stedfast  
+
+	* gmime/gmime-parser.c (parser_construct_message): If we've been
+	told to respect the Content-Length header, then parse the length
+	value and calculate the offset of the beginning of the next
+	message.
+	(g_mime_parser_get_respect_content_length): New function to get
+	whether we've been told to respect the Content-Length header.
+	(g_mime_parser_set_respect_content_length): New function to set
+	this option.
+	(parser_offset): Now takes a private struct pointer rather than
+	the parser object since it didn't really need it. Also makes it
+	usable from check_boundary().
+	(g_mime_parser_tell): Updated.
+	(check_boundary): Only scan for end-boundaries if we've reached
+	the projected end-of-content offset as calculated using the
+	Content-Length header.
+
+2004-02-06  Jeffrey Stedfast  
+
+	* configure.in: Generate examples/Makefile
+
+	* gmime/gmime-utils.c (g_mime_utils_generate_message_id):
+	Simplified and updated for g_gethostbyname_r() API changes.
+
+	* gmime/gmime-error.h: Changed the #define of GMIME_ERROR_QUARK to
+	just be the GQuark variable. Also added GMIME_ERROR_IS_SYSTEM() to
+	decide if an error is a system error (aka errno) or a GMime error.
+
+	* gmime/gmime.c: Make gmime_error_quark an actual variable and
+	initialise it here.
+
+2004-02-05  Jeffrey Stedfast  
+
+	* gmime/gmime-host-utils.c (g_gethostbyname_r): Replace the herr
+	argument with a GError to make the interface a bit nicer to use.
+	(g_gethostbyaddr_r): Same.
+
+	* gmime/url-scanner.c: Added single/double quotes to url_braces[]
+	in case the user is quoting the url.
+	(g_url_web_end): Add "-;:" to list of punctuation to strip off the
+	end of urls. Also fixed to handle user@domain's
+	(g_url_addrspec_start): Strip open brace characters from the
+	beginning of the addr.
+	(g_url_web_start): Make sure "www" wasn't part of something not a
+	url (like "Ewww.Gross") by check that pos[-1] is either an open
+	brace or whitespace.
+	(g_url_addrspec_end): Don't allow toplevel domain addr-specs
+	(if we encounter something that looks like it is a toplevel domain
+	addr, it is more likely to be bogus than correct).
+
+2004-02-04  Jeffrey Stedfast  
+
+	* gmime/gmime-stream-buffer.c (g_mime_stream_buffer_gets): Strip
+	off \r too if the stream is in the canonical form.
+
+	* gmime/gmime.c (g_mime_shutdown): Oops, call
+	g_mime_charset_map_shutdown(), not g_mime_charset_shutdown().
+
+2004-01-26  Jeffrey Stedfast  
+
+	* gmime/gmime.c (g_mime_shutdown): New public function to shutdown
+	GMime. Fixes a segfault in applications that dynamically
+	load/unload GMime during execution.
+
+	* gmime/gmime-iconv.c (g_mime_iconv_init): Don't register an
+	atexit handler.
+	(g_mime_iconv_shutdown): Make public.
+
+	* gmime/gmime-charset.c (g_mime_charset_map_init): Don't set a
+	g_atexit handler for the shutdown routine.
+	(g_mime_charset_map_shutdown): Make public.
+
+2004-01-25  Jeffrey Stedfast  
+
+	* gmime/gmime-param.c: Disable debugging and conditionally disable
+	warnings.
+
+	* gmime/gmime-multipart.c: Disable debugging.
+
+	* gmime/gmime-stream.c: Disable debugging.
+
+	* gmime/internet-address.c: Same.
+
+	* gmime/gmime-parser.c: Conditionally disable warnings.
+
+2004-01-19  Jeffrey Stedfast  
+
+	* gmime/gmime-host-utils.c (g_gethostbyaddr_r): Fixed some compile
+	problems in the IPv6 implementation.
+
+2003-12-16  Jeffrey Stedfast  
+
+	* gmime/gmime-stream-mmap.c (g_mime_stream_mmap_new): Don't add
+	getpagesize() to the file length.
+	(g_mime_stream_mmap_new_with_bounds): Same.
+
+2003-12-11  Jeffrey Stedfast  
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_parse_status): Don't immediately
+	prompt for a passwd after receiving the NEED_PASSPHRASE status
+	message. Instead, parse the userid that gpg needs a passwd for and
+	store it on our context. Wait for a GET_HIDDEN status message
+	before prompting, this way if the user has their gpg configured to
+	use gpg-agent, the user won't get 2 passwd prompts.
+
+2003-12-06  Jeffrey Stedfast  
+
+	* gmime/gmime-parser.c (parser_step_headers): If scanning for eoln
+	results in finding inend, request a refill and try again (changed
+	from inptr + 1 >= inend).
+
+2003-12-05  Jeffrey Stedfast  
+
+	* gmime/internet-address.c (decode_domain): Make sure domain->len
+	> 0 before checking domain->str[domain->len - 1].
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_op_start): Properly set the
+	O_NONBLOCK flag on each of the pipes (ie. we need to get the
+	current flags first and then add the O_NONBLOCK flag rather than
+	just setting the O_NONBLOCK flag by itself).
+
+2003-12-04  Jeffrey Stedfast  
+
+	* README: Updated.
+
+	* configure.in: Bumped version to 2.1.1
+
+2003-12-02  Jeffrey Stedfast  
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_op_start): Modified the code
+	that closes the child's fds to use fcntl and also to start at fd =
+	3 so as to get rid of the need to check for stdin/out/err.
+
+	* gmime/gmime-filter-from.c (filter_filter): Fixed to malloc the
+	correct buffer length.
+
+2003-10-28  Pawel Salek  
+
+	* gmime.h.in: Use macros rather than the global variables to
+	prevent compiler warnings.
+
+	* gmime-error.h: Removed the trailing comma after the last enum
+	value to fix ANSI compile warnings.
+
+	* gmime-filter-basic.h: Same.
+
+	* gmime-filter-best.h: Here too.
+
+	* gmime-filter-crlf.h: And here.
+
+	* gmime-filter-from.h: Same.
+
+	* gmime-filter-yenc.h: Again here.
+
+	* gmime-multipart-encrypted.h: And here.
+
+	* gmime-multipart-signed.h: Here too.
+
+	* gmime-stream-buffer.h: Same.
+
+	* gmime-stream.h: And finally here.
+
+2003-10-08  Jeffrey Stedfast  
+
+	* configure.in: Added a check for altzone.
+
+	* gmime/gmime-utils.c (parse_broken_date, parse_rfc822_date):
+	Account for altzone if the system libc defines it.
+
+2003-09-26  Jeffrey Stedfast  
+
+	* gmime/gmime-host-utils.c (g_gethostbyaddr_r): IPv6
+	implementation rewritten to use getnameinfo() which is the proper
+	function to use in this case.
+
+	* gmime/internet-address.c (internet_address_list_length): Changed
+	to take a const argument.
+	(internet_address_to_string): Now takes a const InternetAddress.
+	(internet_address_list_to_string): Now takes a const
+	InternetAddressList.
+
+2003-09-12  Jeffrey Stedfast  
+
+	* gmime/gmime-stream.c (g_mime_stream_read): If len == 0, return 0.
+	(g_mime_stream_write): Same.
+
+	* gmime/gmime-parser.c (parser_push_boundary): Fix the
+	boundarylenfinal calculation. Thanks to Bart Visscher for catching
+	this mistake.
+
+2003-08-30  Jeffrey Stedfast  
+
+	* gmime/md5-utils.c (md5_get_digest_from_file): Open in binary
+	mode, fixes a bug when built on Win32 systems.
+
+2003-08-09  Jeffrey Stedfast  
+
+	* README: Bumped to version 2.1.0
+
+	* configure.in: Bumped to version 2.1.0
+
+	* gmime/gmime-charset.c (g_mime_charset_name): Added back this
+	symbol in order to avoid breaking ABI.
+	(g_mime_charset_locale_name): Same.
+
+	* gmime/gmime-utils.c (g_mime_utils_generate_message_id): Slight
+	fix for growing the buffer used by g_gethostbyname_r().
+
+2003-08-09  Jeffrey Stedfast  
+
+	* gmime/gmime.h.in: Added new headers.
+
+	* gmime/gmime-utils.c (g_mime_utils_generate_message_id): Use the
+	re-entrant g_gethostbyname_r() function rather than
+	gethostbyname() so that we are threadsafe.
+
+	* gmime/gmime-host-utils.[c,h]: New source files containing
+	gethostbyname_r() and gethostbyaddr_r() implementations.
+
+	* gmime/gmime-filter-windows.[c,h]: New source files implementing
+	a windows charset detection filter.
+
+	* gmime/gmime-charset.c (g_mime_charset_iso_to_windows): New
+	function to return the windows-cp125# equivalent charset for
+	iso-8859-# charsets.
+
+	* gmime/gmime-parser.c (parser_push_boundary): Soptimise a bit :-)
+	(parser_push_boundary): 
+
+2003-08-06  Jeffrey Stedfast  
+
+	* gmime/gmime-multipart.c (g_mime_multipart_foreach): Simplified.
+
+	* gmime/gmime-stream-cat.c (stream_read): Same here.
+	(stream_write): And finally here.
+
+	* gmime/gmime-stream-file.c (stream_read): Same.
+	(stream_write): And again...
+
+	* gmime/gmime-stream-fs.c (stream_read): Here too.
+	(stream_write): And here.
+
+	* gmime/gmime-stream-mmap.c (stream_read): Same as the mem stream.
+	(stream_write): Same.
+
+	* gmime/gmime-stream-mem.c (stream_read): Need to fix the MIN
+	expresion so that both args are signed, otherwise 'len' will be
+	the min if the 'bytes-left' calculation is negative.
+	(stream_write): Same.
+
+2003-07-29  Jeffrey Stedfast  
+
+	* gmime/gmime-message.c (g_mime_message_get_recipients): Return
+	const.
+
+	* gmime/gmime-message-part.c (g_mime_message_part_get_message):
+	Ref the content message before returning it.
+
+2003-07-25  Jeffrey Stedfast  
+
+	* gmime/gmime-multipart.c (g_mime_multipart_foreach): Don't
+	descend recursively... make the user descend into sub-multiparts
+	him/herself. This makes more sense since the callback will be
+	called on the multipart too...
+	(g_mime_multipart_get_subpart_from_content_id): Make checking if
+	the subpart is a multipart more efficient by using
+	GMIME_IS_MULTIPART macro.
+
+2003-07-15  Jeffrey Stedfast  
+
+	* gmime/gmime-charset.c (g_mime_charset_canon_name): Updated to
+	return canonical charset names for windows-cp125x charsets.
+
+2003-06-19  Jeffrey Stedfast  
+
+	* README: Added a section for links to language bindings starting
+	with the Perl MIME::Fast modules.
+
+	* docs/reference/question_index.sgml: Updated docs about the Perl
+	bindings.
+
+	* docs/tutorial/gmime-tut.sgml: Updated slightly.
+
+2003-06-14  Jeffrey Stedfast  
+
+	* gmime/gmime-parser.c (g_mime_parser_get_persist_stream): New
+	function to get whether or not the parser will attempt to keep the
+	content on disk when it constructs messages.
+	(g_mime_parser_set_persist_stream): New function to set whether or
+	not the above should be done.
+	(parser_scan_mime_part_content): Only load content if persist and
+	seekable are both TRUE.
+
+	* gmime/gmime-stream-fs.c (g_mime_stream_fs_get_owner): Same idea.
+	(g_mime_stream_fs_set_owner): And here.
+
+	* gmime/gmime-stream-file.c (g_mime_stream_file_get_owner): New
+	function, just like StreamMem.
+	(g_mime_stream_file_set_owner): Same.
+
+	* gmime/gmime-stream-mem.c (g_mime_stream_mem_set_owner): New
+	function to set whether or not the memory stream should free the
+	backend memory buffer when finalized.
+	(g_mime_stream_mem_get_owner): New function to get the above
+	attribute.
+
+2003-06-12  Jeffrey Stedfast  
+
+	* gmime/gtrie.c (g_trie_free): Free the fail_states array.
+
+2003-05-26  Jeffrey Stedfast  
+
+	* gmime/gmime-common.c (g_mime_strcase_hash): Oops, fixed a bug.
+
+	* gmime/gmime-multipart-signed.c (g_mime_multipart_signed_verify):
+	Do not strip trailing whitespace when verifying, this should allow
+	us to verify both rfc2015 and rfc3156 signed messages (as well as
+	this being the correct way of doing it anyway).
+
+2003-05-26  Jeffrey Stedfast  
+
+	* gmime/gmime-common.[c,h]: New source files implementing some
+	common routines scattered throughout the gmime sources (currently
+	a strcase_hash and strcase_equal implementation).
+
+	* gmime/gmime-object.c (type_registry_init): Use the new
+	g_mime_strcase_[hash,equal] functions from gmime-common.h.
+	(g_mime_object_register_type): Here too.
+
+	* gmime/gmime-filter-enriched.c
+	(g_mime_filter_enriched_class_init): Use the new
+	g_mime_strcase_[hash,equal] functions from gmime-common.h.
+
+2003-05-22  Jeffrey Stedfast  
+
+	* gmime/gmime-parser.c (parser_construct_multipart): Fixed to
+	properly handle multiparts which do not end with their own
+	end-boundary. See bug #113527 for details.
+
+2003-05-22  Jeffrey Stedfast  
+
+	* configure.in: Check for sys/param.h
+
+	* gmime/gmime-stream-mmap.h: Removed sys/mman.h and unistd.h from
+	the #includes. These are needed in the ehader and will break the
+	build on win32.
+
+	* gmime/gmime-utils.c: Only #include sys/param.h if the system has
+	it. Also added unistd.h and sys/types.h as they should have been
+	there for pid_t.
+
+2003-05-21  Jeffrey Stedfast  
+
+	* gmime/gmime-message.c (handle_multipart_mixed): Don't look at
+	the subtype of the first_type unless we have already defined
+	first_type. Fixes a crash.
+
+	* gmime/gmime-multipart.c
+	(g_mime_multipart_get_subpart_from_content_id): Don't return a
+	const GMimeObject, ref it to be consistant with the rest of the
+	API.
+
+	* gmime/gmime-message-partial.c
+	(g_mime_message_partial_split_message): Fixed an optimisation gone
+	bad. Thanks to Piotr Klaban for reporting this.
+
+2003-05-19  Jeffrey Stedfast  
+
+	* tests/test-mbox.c: Fixed a memory leak.
+
+	* gmime/gmime-multipart-encrypted.c: Same as below.
+
+	* gmime/gmime-multipart-signed.c: Fixed the prototype for
+	write_to_stream().
+
+2003-05-17  Jeffrey Stedfast  
+
+	* docs/reference/streams.sgml: Updated for correctness.
+
+	* docs/reference/data-wrappers.sgml: Pretty much re-written to
+	better explain GMimeDataWrapper.
+
+	* gmime/gmime-session-simple.[c,h]: New simple instantiable class
+	implementing the GMimeSession interfaces.
+
+2003-04-30  Jeffrey Stedfast  
+
+	* tests/test-mime.c: Fixed some compile warnings.
+
+	* src/uudecode.c: Fixed some compile warnings.
+
+	* src/uuencode.c: Fixed some compile warnings.
+
+	* gmime/gmime-parser.c (parser_scan_content): Initialise 'start'.
+
+	* gmime/gmime-multipart-signed.c: #include 
+
+	* gmime/gmime-message-part.c: #include 
+
+	* gmime/gmime-filter-enriched.c: #include  for strtoul.
+
+	* gmime/gmime-charset.c (strdown): New function to lowercasify a
+	string inline (rather than being lame and strdup'ing the bloody
+	string like g_ascii_strdown does).
+
+	* gmime/gmime-iconv.c: Turn off cache debugging.
+
+2003-04-21  Jeffrey Stedfast  
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_new): Initialise seen_eof1 to
+	TRUE.
+	(gpg_ctx_set_ostream): Set seen_eof1 to FALSE here, this way we
+	only ever check for EOF for gpg's stdout if we care about the data
+	received from it.
+	(gpg_ctx_parse_status): Remove the hack that set seen_eof1 to TRUE
+	when we received a TRUST status from gpg when verifying a
+	signature. Same for when importing signatures.
+	(gpg_ctx_op_step): Only FD_SET() fd's that we have not finished
+	reading from.
+	(gpg_ctx_op_exited): #if 0'd for now since we aren't using it
+	anymore. Keeping it around for historical reasons and in case we
+	find we really do need it back.
+
+2003-04-15  Jeffrey Stedfast  
+
+	* configure.in: Check for netdb.h, gethostname and gethostbyname.
+
+	* gmime/gmime-utils.c (g_mime_utils_generate_message_id): Guard
+	against systems without netdb.h, gethostname() and/or
+	gethostbyname(). Seems MingW does not have these things.
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_get_diagnostics): Flush the
+	diagnostics stream and append a nul-byte. This allows us to return
+	a const char * which will allow us to avoid strdup/free later.
+	(gpg_ctx_free): Unref the diagnostics stream.
+	(gpg_ctx_new): Get the locale charset and setup a charset filter
+	for the diagnostics stream (use a stream instead of a GByteArray
+	like we did before so we can do charset conversion more easily).
+	(gpg_ctx_op_step): Use g_mime_stream_write() to append data to the
+	diagnostics buffer instead of g_byte_array_append() - this way we
+	get some charset filtering action. When reporting errors, use
+	gpg_ctx_get_diagnostics(). Also make the errors reported to the
+	user a little nicer.
+	(gpg_sign): Diagnostics is now const, so don't free the result.
+	(gpg_verify): Same. But also don't exit the main loop when gpg
+	exits - there could still be data in the pipes left to read.
+	(gpg_encrypt): Same as gpg_sign().
+	(gpg_decrypt): Same here.
+	(gpg_import_keys): Here too.
+	(gpg_export_keys): And here.
+	(gpg_ctx_parse_status): Convert the userid hint to UTF-8.
+
+2003-03-31  Jeffrey Stedfast  
+
+	* gmime/*.c: s/g_str[n]casecmp/str[n]casecmp/g
+
+	* configure.in: Change the check for mmap so that we know we not
+	only have mmap defined, but also that it "works". Also added
+	checks for strcasecmp and strncasecmp and define them to the glib
+	versions if appropriate (g_ascii_str[n]casecmp since
+	g_str[n]casecmp is apparently deprecated *sigh*). Doing this
+	because I don't want to type g_ascii_str[n]casecmp. Call me a lazy
+	bastard, but this is rediculous.
+
+	* gmime/gmime-filter-enriched.[c,h]: New source files that can be
+	used to convert text/enriched and text/rtf to text/html.
+
+2003-03-31  Jeffrey Stedfast  
+
+	* PORTING: Began writing a porting guide for developers porting
+	their applications from GMime 2.0 to GMime 2.2.
+
+	* gmime/gmime-utils.c (g_mime_utils_8bit_header_encode_phrase):
+	Re-added for binary compatability. At least for now?
+	(g_mime_utils_8bit_header_encode): Same.
+	(g_mime_utils_8bit_header_decode): Here too.
+
+2003-03-30  Jeffrey Stedfast  
+
+	* gmime/internet-address.c (internet_address_new_name): Use
+	header_decode_phrase().
+	(internet_address_new_group): Same.
+	(internet_address_set_name): Again here.
+	(encoded_name): Always use encode_phrase() here if rfc2047_encode
+	is TRUE, even if the raw name contains no 8bit characters. It
+	*should* do the Right Thing (tm) now.
+
+	* gmime/gmime-param.c (decode_param): Use
+	g_mime_utils_header_decode_text().
+
+	* gmime/gmime-message.c (g_mime_message_set_subject): Use
+	g_mime_utils_header_encode_text().
+
+	* gmime/gmime-utils.c (g_mime_utils_header_encode_phrase):
+	Renamed. Also rewritten to do the Right Thing (ie. Group 'word's
+	by type and so forth).
+	(g_mime_utils_header_encode_text): Renamed from
+	8bit_header_encode() to make it clear that this function is meant
+	to encode 'text' fields (see rfc822 for the definition of 'text'
+	and for which headers have text values). Does the same basic
+	thing, but now shares a lot of code with encode_phrase().
+	(rfc2047_encode_get_rfc822_words): Renamed from
+	rfc2047_encode_phrase_get_words() - also now handles WORD_QSTRING
+	and takes an arg to determine whether or not to allow for QSTRING
+	words.
+	(g_mime_utils_text_is_8bit): Don't go past '\0' if we encounter
+	one before inend. Should allow our caller to cheat and pass in -1
+	instead of strlen()ing the string if the string is nul-terminated.
+	(g_mime_utils_header_decode_text): Renamed from
+	8bit_header_decode(). Also made a lot less strict.
+	(g_mime_utils_header_decode_phrase): Basically the same as
+	decode_text() but with the same strictness of previous versions.
+
+2003-03-30  Jeffrey Stedfast  
+
+	* gmime/gmime-message.c (g_mime_message_set_subject): Encode the
+	subject before setting it in the raw header list.
+
+	* gmime/gmime-header.c (g_mime_header_add): Don't try to encode
+	the header here. This is not our responsibility.
+	(g_mime_header_set): Same.
+
+2003-03-27  Jeffrey Stedfast  
+
+	* gmime/gmime-utils.c (rfc2047_encode_word): Add 1 to enclen so as
+	to protect against buffer overruns.
+	(rfc2047_encode_phrase_get_words): if c > 127 && c < 256, then set
+	encoding to MAX (encoding, 1), not 2.
+
+2003-03-11  Charles Kerr 
+
+	* gmime/md5-utils.c (md5_get_digest_from_file): fix
+	dangling file pointer.
+
+2003-03-09  Jeffrey Stedfast  
+
+	* gmime/url-scanner.c (g_url_addrspec_end): Make sure inptr != pos
+	+ 1, if it does, then return FALSE.
+	
+2003-03-06  Jeffrey Stedfast  
+
+	* configure.in: Check that the compiler supports the inline
+	optimisation keyword (or variant) and #define it to 'inline'.
+
+	* gmime/gtrie.c (trie_utf8_getc): Same.
+
+	* gmime/gmime-filter-html.c (html_utf8_getc): Use the inline macro.
+
+2003-03-03  Jeffrey Stedfast  
+
+	* gmime/gmime-filter-charset.c (filter_filter): Use outbuf -
+	filter->outbuf to calculate how much data we've written - simpler
+	and less likely to be wrong.
+	(filter_complete): Same.
+
+	* gmime/gmime-iconv.c: Modified to use the new cache
+	implementation in cache.c
+
+	* gmime/cache.[c,h]: New source files implementing an LRU cache.
+
+	* gmime/list.[c,h]: New source files containing a really nice/fast
+	linked-list implementation.
+
+2003-03-02  Jeffrey Stedfast  
+
+	* gmime/gmime-iconv.c (iconv_cache_bucket_new): If the current
+	list of cache buckets is non-NULL, set list->prev to the new
+	bucket being prepended.
+	(g_mime_iconv_open): Only expire unused if the cache size is
+	greater than the max allowable size.
+
+2003-02-27  Jeffrey Stedfast  
+
+	* gmime/gmime-stream-filter.c (stream_read): Set priv->flushed to
+	TRUE if we call g_mime_filter_complete() on our filters.
+	(stream_eos): It's not actually the end of the stream until we've
+	flushed the filters. This fixes some possible truncation when
+	reading from a filtered stream.
+
+2003-02-25  Jeffrey Stedfast  
+
+	* README: Bumped version to 2.1.0
+
+	* configure.in: Bumped version to 2.1.0
+
+	* gmime/gmime-utils.c (rfc2047_decode_word): Use
+	g_mime_locale_charset().
+
+	* gmime/gmime-param.c (rfc2184_decode): Use
+	g_mime_locale_charset().
+
+	* gmime/gmime-iconv-utils.c (iconv_utils_init): Same as
+	below. Also use g_mime_locale_charset() rather than
+	g_mime_charset_locale_name().
+
+	* gmime/gmime-iconv.c (g_mime_iconv_open): Use
+	g_mime_charset_iconv_name() instead of the older deprecated
+	g_mime_charset_name() function.
+
+	* gmime/gmime-charset.c (g_mime_charset_map_init): Initialize the
+	locale_lang.
+	(g_mime_charset_iconv_name): Renamed from g_mime_charset_name()
+	(g_mime_charset_canon_name): New function which does almost the
+	same thing as g_mime_charset_iconv_name() except that it will
+	always return the canonical forms of the iso-8859 charsets.
+	(g_mime_locale_charset): Renamed from g_mime_charset_locale_name()
+	(g_mime_locale_language): New function to return the user's locale
+	language.
+	(g_mime_charset_language): New function to map charsets to their
+	language code (meant for CJKR).
+
+2003-02-13  Jeffrey Stedfast  
+
+	* README: Bumped version to 2.0.2
+
+	* configure.in: Bumped version to 2.0.2
+
+	* gmime/gmime-parser.c (parser_scan_content): Stop looping if/when
+	we find EOS in all cases. Also handle the case where an
+	[end-]boundary ends an an EOS rather than a new-line.
+
+2003-02-14  Jeffrey Stedfast  
+
+	* gmime/url-scanner.c (g_url_file_end): If the file:// url is
+	preceded with some sort of brace, when scanning for the end of the
+	url - take this into consideration.
+	(g_url_web_end): Same.
+
+2003-02-13  Jeffrey Stedfast  
+
+	* gmime/gmime-gpg-context.c: #include 
+
+2003-02-12  Jeffrey Stedfast  
+
+	* gmime/url-scanner.c: Fixed the table to treat >=127 as a CTRL
+	character.
+
+	* gmime/gtrie.c (trie_utf8_getc): When we encounter an invalid
+	UTF-8 sequence, update in to point to in+1 and return 0xffff.
+	(g_trie_add): Handle invalid UTF-8 sequences (ie, c == 0xffff).
+	(g_trie_search): Same.
+
+	* gmime/gmime-filter-html.c (html_utf8_getc): Shortcut if inptr ==
+	inend by returning 0 and treating it as if we found the
+	terminating nul-char.
+
+2003-02-08  Jeffrey Stedfast  
+
+	* configure.in: Bumped the version to 2.0.1
+
+	* docs/*: A completely new set of documentation.
+
+2003-02-07  Jeffrey Stedfast  
+
+	* gmime/gmime-multipart.c (multipart_remove_part): When the part
+	being removed is not the first part in the list, make sure to set
+	node->prev->next = node->next -- oops :-)
+	(multipart_remove_part_at): Same.
+
+2003-01-25  Jeffrey Stedfast  
+
+	* configure.in: Bumped the version to 2.0.0
+
+	* gmime/gmime-filter-html.c (writeln): Read the stream as UTF-8
+	rather than 8bit so that we can properly write out unicode
+	entities.
+
+2002-12-17  Jeffrey Stedfast  
+
+	Build fixes for G_DISABLE_DEPRECATED
+
+	* gmime/gmime-param.c (encode_param): Replace calls to
+	g_string_sprintfa() with g_string_append_printf() since the former
+	is marked as being deprecated.
+	(param_list_format): Same.
+
+	* gmime/gmime-utils.c (rfc2047_encode_word): Here too.
+
+2002-12-16  Jeffrey Stedfast  
+
+	* configure.in: Bumped the version to 1.90.8
+
+	* doc/gmime-doc.sgml: Added a section for GMimeFilterMd5.
+
+	* doc/gmime-sections.txt: Added a section on GMimeFilterMd5.
+
+	* tests/test-parser.c (print_mime_struct): Validate Content-Md5
+	headers.
+
+	* gmime/gmime-part.c (g_mime_part_set_content_md5): Rewritten to
+	use the md5 filter and also to do things the right way by
+	converting textual parts to their canonical CRLF form.
+	(g_mime_part_verify_content_md5): Same.
+
+	* gmime/gmime-filter-md5.[c,h]: New filter to compute the md5
+	digest of a stream passed through it.
+
+2002-12-11  Jeffrey Stedfast  
+
+	* gmime/gmime-message.c (g_mime_message_get_body): Reworked the
+	logic a bit to properly handle multipart/alternative.
+
+2002-12-10  Jeffrey Stedfast  
+
+	* configure.in: Bumped the version to 1.90.7
+
+2002-12-09  Jeffrey Stedfast  
+
+	* gmime/url-scanner.c: Use our own masking table since we need it
+	atoms to be slightly different. There's a few more chars we want
+	to restrict. Also has the benefit of being easier to split out if
+	someone else wants to use it.
+	(g_url_addrspec_end): Fixed to not be fooled in the case where the
+	address is followed immediately by a period.
+	(g_url_web_end): Made more robust.
+	(g_url_scanner_scan): Oops. We need to set the match->pattern
+	string pointer to the correct pattern before executing the
+	start/end methods (as some of them rely on this info).
+
+2002-12-09  Jeffrey Stedfast  
+
+	* gmime/url-scanner.c: Don't need a hash table anymore.
+	(g_url_scanner_add): When adding a pattern to the trie, use the
+	array index as the pattern_id argument.
+	(g_url_scanner_scan): Use the matched_id set by g_trie_search() to
+	lookup the urlpattern_t instead of using a hash table.
+
+	* gmime/gtrie.c (g_trie_add): Now takes a pattern_id argument so
+	that we can avoid the use of GQuarks and thus save on unecessary
+	memory usage.
+	(g_trie_search): Instead of giving our caller back the pattern
+	string pointer, give him back the pattern id.
+
+2002-12-09  Jeffrey Stedfast  
+
+	* gmime/gtrie.c (g_trie_matches): Removed.
+	(g_trie_search): Fixed the FIXME.
+
+2002-12-09  Jeffrey Stedfast  
+
+	* gmime/gmime-filter-html.c: Modified to use url-scanner.c instead
+	of using glibc's regex routines. This has improved performance by
+	~16.5x not to mention that it is also more accurate than the regex
+	patterns had been (the url scanner can be setup to be much
+	stricter in the matching).
+
+	* gmime/url-scanner.c: New source file implementing a simple
+	expression scanner meant (currently designed for url matching)
+	which uses gtrie.
+
+	* gmime/gtrie.c: New source file implementing Aho-Corasick's Trie
+	graph algorithm.
+
+2002-12-08  Jeffrey Stedfast  
+
+	Fix for bug #91536
+
+	* gmime/gmime-object.c (g_mime_object_register_type): Use a struct
+	to hold the object_type for the subtype hash. 64 archs use 32bit
+	ints and so using GINT_TO_POINTER() and GPOINTER_TO_INT() doesn't
+	work.
+	(g_mime_object_new_type): Get the object_type from the subtype
+	bucket.
+
+2002-12-06  Jeffrey Stedfast  
+
+	* gmime/gmime-stream.c (g_mime_stream_writev): Pointer arithmetic
+	fixes.
+
+	* gmime/memchunk.c (memchunk_alloc): Pointer arithmetic fixes.
+
+2002-12-03  Jeffrey Stedfast  
+
+	* gmime/gmime-utils.c (datetok): Modified to properly handle when
+	the first char of a token is a special char (such as a '-') that
+	is also used as a token delimiter.
+
+2002-12-02  Jeffrey Stedfast  
+
+	* gmime/gmime-filter-html.c (g_mime_filter_html_init): match
+	REG_ICASE so we don't cut off at the first capital letter, duh.
+
+2002-12-01  Jeffrey Stedfast  
+
+	* gmime/gmime-utils.c: #define _GNU_SOURCE for isblank on GNU
+	systems.
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_op_wait): Fixed the errno
+	saving.
+
+2002-11-21  Jeffrey Stedfast  
+
+	* gmime/gmime-message.c (write_received): After skipping the
+	special received token and it's value, skip any following comments
+	as well.
+	(skip_addrspec): Skip past the '.' and '@' chars before decoding
+	the next word or domain respectively.
+
+2002-11-20  Jeffrey Stedfast  
+
+	* gmime/gmime-message.c (write_received): New function to nicely
+	format Received headers.
+	(write_msgid): New writer function that doesn't fold the msg-id no
+	matter now long it is.
+	(g_mime_message_init): Override the writer functions for Received
+	and Message-Id headers. Should we also override the writer
+	function for Path headers to not wrap?
+
+	* gmime/internet-address.c (decode_addrspec): Get rid of an extra
+	call to decode_lwsp that wasn't needed.
+
+	* gmime/gmime-header.c (g_mime_header_register_writer): Renamed.
+
+2002-11-18  Jeffrey Stedfast  
+
+	* configure.in: Make sure to include -liconv on systems that need it.
+
+2002-11-17  Jeffrey Stedfast  
+
+	* configure.in: Check for gethostbyname in -lnsl and also bump the
+	version to 1.90.6.
+
+	* src/getopt*.[c,h]: Added for portability to non-GNU systems.
+
+	* gmime/gmime-parser.c (g_mime_parser_init): Initialize scan_from
+	and have_regex here instead of in parser_init() since we don't
+	want these flags to be reset when a new stream gets set.
+	(g_mime_parser_new_with_stream): New convenience function.
+
+2002-11-16  Jeffrey Stedfast  
+
+	* gmime/gmime-utils.c (decode_msgid): Eat the '<' before
+	continuing to parse the addr-spec.
+
+2002-11-14  Jeffrey Stedfast  
+
+	* gmime/gmime-content-type.c
+	(g_mime_content_type_new_from_string): #include
+	"gmime-table-private.h" and use is_ttoken() to correctly parse
+	type/subtype. Fixes bug #98463.
+
+2002-11-13  Jeffrey Stedfast  
+
+	* gmime/gmime-gpg-context.c (gpg_ctx_op_start): Don't bother
+	stat()ing gpg->path, if the file doesn't exist, the exec() call
+	will return immediately anyway.
+
+2002-11-13  Jeffrey Stedfast  
+
+	* configure.in: Bumped the version to 1.90.5.
+
+	* gmime/Makefile.am: Remove gmime-exception-list.def from the
+	EXTRAS.
+
+2002-11-12  Jeffrey Stedfast  
+
+	* doc/*: Updated.
+
+	* gmime/gmime-error.h: Added.
+
+	* gmime/gmime-multipart-encrypted.[c,h]: Use GError instead of
+	GMimeException.
+
+	* gmime/gmime-multipart-signed.[c,h]: Same.
+
+	* gmime/gmime-session.[c,h]: Here too.
+
+	* gmime/gmime-gpg-context.[c,h]: Don't use GMimeException anymore,
+	instead use GError.
+
+	* gmime/gmime-cipher-context.[c,h]: Same here.
+
+	* gmime/gmime.h.in: Remove gmime-exception.h and add gmime-error.h
+
+2002-11-09  Jeffrey Stedfast  
+
+	* configure.in: Generate src/Makefile.
+
+	* Makefile.am: Add src to the SUBDIRS.
+
+	* src/Makefile.am: Build uuencode and uudecode.
+
+	* src/uuencode.c: New source file emulating GNU shareutils'
+	uuencode.
+
+	* src/uudecode.c: New source file emulating GNU shareutils'
+	uudecode.
+
+2002-11-07  Jeffrey Stedfast  
+
+	* configure.in: Bumped the version to 1.90.4
+
+	* PORTING: New document meant to help developers port their
+	applications from gmime-1.0 to gmime-2.0.
+
+	* iconv-detect.c: Removed unused variables and #include 
+
+	* gmime/gmime-multipart.c
+	(g_mime_multipart_get_subpart_from_content_id): Init part to NULL.
+
+	* gmime/gmime-stream-cat.c (stream_write): Init n to -1 each time
+	through the outer loop.
+
+	* gmime/gmime-filter-strip.c: #include  for memcpy.
+
+	* gmime/gmime-filter-html.c (html_convert): Make sure to
+	initialise depth to 0 each loop so we don't use it uninitialised.
+
+2002-11-07  Jeffrey Stedfast  
+
+	* gmime*.[c,h]: Moved to gmime/ subdirectory. Also updated to
+	#include  instead of #include "some-header.h"
+
+	* test-*.c: Moved to tests/ subdirectory.
+
+2002-11-06  Jeffrey Stedfast  
+
+	* Makefile.am: Install headers to $(includedir)/gmime-2.0/gmime
+
+2002-11-04  Jeffrey Stedfast  
+
+	* gmime-filter-basic.c (g_mime_filter_basic_new_type): Set the
+	new->type to type.
+
+2002-11-01  Jeffrey Stedfast  
+
+	* gmime.h.in: Wrap in #ifdef __cplusplus
+
+	* gmime-filter-html.c (html_convert): If flush is TRUE, flush any
+	remaining input rather than backing it up.
+
+2002-10-31  Jeffrey Stedfast  
+
+	* gmime-gpg-context.c: Renamed stdin to stdin_fd, stdout to
+	stdout_fd, and stderr to stderr_fd to be more portable.
+
+2002-10-30  Jeffrey Stedfast  
+
+	* gmime-filter-html.c (html_convert): Rewrote to use regex for
+	url/addr extraction. Outputs more correct html now too.
+
+2002-10-18  Jeffrey Stedfast  
+
+	* gmime-stream-filter.c (stream_read): Change presize from an int
+	to a size_t to fix a 64bit cleanliness bug.
+	(stream_write): Same.
+
+2002-10-14  Jeffrey Stedfast  
+
+	* gmime-gpg-context.c (gpg_ctx_get_argv): Setup the import/export
+	command-line.
+	(gpg_ctx_op_step): Handle import/export errors.
+	(gpg_import_keys): Implemented.
+	(gpg_export_keys): Implemented.
+	(gpg_ctx_op_step): Don't do anything with gpg's stdin unless we
+	have something to write to it (exporting keys doesn't require
+	writing to gpg's stdin).
+
+2002-10-13  Jeffrey Stedfast  
+
+	* doc/*: Updated.
+
+	* gmime-utils.c (g_mime_utils_generate_message_id): New function
+	to generate a valid unique message-id string.
+
+2002-10-08  Jeffrey Stedfast  
+
+	Fixes to make g_mime_message_partial_split_message() use the
+	correct token as the id parameter.
+
+	* gmime-object.c (g_mime_object_set_content_id): Same as with
+	GMimeMessage::message_id.
+	(process_header): Same as process_header for gmime-message.c but
+	for content_id.
+
+	* gmime-message.c (process_header): Set only the addr-spec portion
+	of the msgid.
+	(g_mime_message_set_message_id): Treat the message_id passed in as
+	the addr-spec msgid (ie, as if it didn't contain <>'s).
+
+2002-10-02  Jeffrey Stedfast  
+
+	* gmime-gpg-context.c (gpg_import_keys): Renamed.
+	(gpg_export_keys): Renamed.
+
+	* gmime-cipher-context.c (g_mime_cipher_export_keys): Renamed to
+	be friendlier toward c++.
+	(g_mime_cipher_import_keys): Renamed to be similarly named with
+	the above function.
+
+2002-09-30  Jeffrey Stedfast  
+
+	* configure.in: Bumped version.
+
+	* Makefile.am: Don't install gmime.m4
+
+	* gmime.m4: Removed.
+
+2002-09-30  Jeffrey Stedfast  
+
+	* gmime-filter-charset.c (filter_filter): Rewritten, don't set
+	errno to 0 before calling iconv (we can't assume that on success
+	errno will not be set?). Also, don't grow the buffer here, save
+	any un-converted text in the backup buffer to be converted next
+	time through.
+	(filter_complete): Pick up the slack of filter_filter by
+	converting anything left over.
+
+2002-09-29  Jeffrey Stedfast  
+
+	* gmime-filter[c,h]: Ported to GObject.
+
+	* gmime-filter-basic.[c,h]:
+	* gmime-filter-best.[c,h]:
+	* gmime-filter-charset.[c,h]:
+	* gmime-filter-crlf.[c,h]:
+	* gmime-filter-from.[c,h]:
+	* gmime-filter-html.[c,h]:
+	* gmime-filter-strip.[c,h]:
+	* gmime-filter-yenc.[c,h]: Ported to the new GMimeFilter.
+
+	* gmime-data-wrapper.c (write_to_stream): Unref the filter after
+	adding it to the filtered stream.
+
+	* gmime-multipart-encrypted.c
+	(g_mime_multipart_encrypted_encrypt): Unref the filters once we've
+	added them to the filtered_stream.
+	(g_mime_multipart_encrypted_decrypt): And here.
+
+	* gmime-multipart-signed.c (g_mime_multipart_signed_sign): Unref
+	the filters once we've added them to the filtered_stream.
+	(g_mime_multipart_signed_verify): Same here.
+
+	* gmime-part.c (write_content): Unref the filter.
+	(g_mime_part_set_pre_encoded_content): Here too.
+
+	* gmime-stream-filter.c (g_mime_stream_filter_add): Ref the filter
+	here.
+	(g_mime_stream_filter_remove): Unref the filter.
+	(g_mime_stream_filter_finalize): Unref the filters here.
+
+2002-09-23  Jeffrey Stedfast  
+
+	* gmime-filter-charset.c: Try our best to handle EILSEQ (illegal
+	multibyte sequences) by eating the illegal bytes and
+	continuing. This seems to be what users expect (it's what Mozilla
+	seems to do).
+
+2002-09-15  Jeffrey Stedfast  
+
+	* gmime-charset.c (g_mime_charset_name): Don't g_assert after
+	using strtoul on the iso charset name, seems that some news
+	clients use 'isolatin' as if it were a real charset (it's not) and
+	we don't want to abort() on this.
+
+2002-09-14  Jeffrey Stedfast  
+
+	* doc/*: Updated.
+
+	* gmime-utils.c (g_mime_utils_decode_message_id): New function to
+	decode a message-id as defined by rfc822.
+	(g_mime_references_decode): New function to decode a references or
+	in-reply-to header.
+	(g_mime_references_append): New function to append a raw
+	message-id to a GMimeReferences list.
+	(g_mime_references_clear): New function to clear a GMimeReferences
+	list.
+
+	* internet-address.c (decode_addrspec): New function to parse an
+	addr-spec needed by the msg-id decoder.
+	(decode_lwsp): Make public.
+	(decode_word): Same.
+
+2002-09-08  Jeffrey Stedfast  
+
+	* gmime-utils.c (parse_broken_date): Wrap printfs in d() to
+	prevent them from printing anything unless debugging is turned on.
+
+2002-09-03  Jeffrey Stedfast  
+
+	* gmime-utils.c (get_tzone): Fixed to not get false positives when
+	the token is shorter than the actual timezone string (but matches
+	the first little bit of it).
+
+2002-09-03  Tomasz K³oczko  
+
+	* Makefile.am: fixes for automake >= 1.5 (removed duplicated
+	variables) and few minor cleanups and better method for install gmime
+	aclocal macros.
+
+	* doc/Makefile.am: fixes for "make install DESTDIR=".
+
+2002-09-01  Jeffrey Stedfast  
+
+	* internet-address.c (decode_mailbox): When erroring out due to no
+	local part in the add-spec, set *in to inptr + 1 so we don't get
+	into an infinite loop.
+
+	* gmime-message-part.c (message_part_remove_header): Same as
+	below.
+
+	* gmime-multipart.c (multipart_remove_header): Same as
+	gmime-part.c
+
+	* gmime-part.c (mime_part_remove_header): Don't return anything
+	here since our function is supposed to return void.
+
+2002-08-31  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_scan_mime_part_content): Pass `content'
+	into parser_scan_content(), fixes bug #92183.
+
+2002-08-30  Jeffrey Stedfast  
+
+	* configure.in: Bumped version to 1.90.1
+
+	* doc/Makefile.am: Don't gtkdoc-fixxref if the user disabled
+	gtk-doc from the build.
+
+2002-08-25  Jeffrey Stedfast  
+
+	* test-best.c: New test suite for the gmime-filter-best filter.
+
+	* gmime.h.in: Added gmime-filter-best.h
+
+	* gmime-filter-best.c (g_mime_filter_best_charset): Never return
+	NULL, instead return us-ascii.
+	(filter_filter): Fixed to not get into an infinite loop.
+
+2002-08-23  Jeffrey Stedfast  
+
+	* doc/*: Updated.
+
+	* gmime-message-part.c (message_part_write_to_stream): Changed the
+	prototype to return ssize_t and not int.
+
+2002-08-21  Jeffrey Stedfast  
+
+	* gmime-filter-best.c: New filter for calculating the best charset
+	and encoding for a stream.
+
+	* gmime-iconv-utils.c (g_mime_iconv_locale_to_utf8): Make
+	threadsafe.
+	(g_mime_iconv_locale_to_utf8_length): Same.
+	(g_mime_iconv_utf8_to_locale): Here too.
+	(g_mime_iconv_utf8_to_locale_length): And here.
+
+	* gmime.c (g_mime_init): Updated to call
+	g_mime_charset_map_init().
+
+	* gmime-charset.c (g_mime_charset_locale_name): Initialize the
+	charset map if it hasn't already been initialized.
+	(g_mime_charset_map_init): Renamed from g_mime_charset_init().
+	(g_mime_charset_init): Renamed from charset_init() and also made
+	it globally accessable.
+	(g_mime_charset_step): New external function (was an internal
+	function before).
+	(g_mime_charset_best_name): Now an external function also.
+
+2002-08-19  Jeffrey Stedfast  
+
+	* gmime-gpg-context.c (gpg_decrypt): Report better errors for when
+	gpg fails to be executed.
+	(gpg_encrypt): Same.
+	(gpg_verify): Here too.
+	(gpg_sign): And here.
+	(gpg_ctx_op_start): Try stat()ing the gpg binary to make sure it
+	exists and when handling an exception, save errno so we can re-set
+	it after cleanup.
+
+2002-08-11  Jeffrey Stedfast  
+
+	* gmime-iconv.c: Instead of checking for #ifdef _REENTRANT, just
+	check #ifdef G_THREADS_ENABLED and use a GStaticMutex rather than
+	a pthread_mutex_t.
+
+	* gmime-charset.c (g_mime_charset_init): Use nl_langinfo() if it
+	is available.
+	(g_mime_charset_name): Call g_mime_charset_init() if
+	iconv_charsets is NULL (meaning the programmer did not properly
+	initialize gmime). Also do mutex locking around the use of the
+	iconv_charset hash table.
+
+2002-08-10  Jeffrey Stedfast  
+
+	* test-pgpmime.c (test_multipart_signed): Unref the content object
+	after setting it on the MIME part.
+
+	* gmime-multipart-signed.c (g_mime_multipart_signed_sign): Unref
+	the content object after setting it on the MIME part.
+	(g_mime_multipart_signed_verify): Unref the content object after
+	we're done with it.
+
+	* gmime-multipart-encrypted.c
+	(g_mime_multipart_encrypted_encrypt): Unref the content object
+	after setting it on the MIME part.
+	(g_mime_multipart_encrypted_decrypt): Unref the content object
+	after we're done with it.
+
+	* gmime-message-partial.c
+	(g_mime_message_partial_reconstruct_message): Unref the content
+	object when we're done with it.
+	(g_mime_message_partial_split_message): Unref the content object
+	after setting it on the MIME part.
+
+	* gmime-parser.c (parser_scan_mime_part_content): Unref the
+	content object after setting it on the MIME part.
+
+	* gmime-part.c (g_mime_part_set_content_object): Ref the new
+	content object and unref the old.
+	(g_mime_part_get_content_object): Ref the content object before
+	returning it to our caller.
+	(g_mime_part_finalize): Unref the content object.
+
+	* gmime-data-wrapper.c: Rewritten to subclass GObject.
+	(g_mime_data_wrapper_destroy): Removed.
+	(g_mime_data_wrapper_write_to_stream): Virtualize.
+
+2002-08-08  Jeffrey Stedfast  
+
+	* gmime-iconv.c: Implemented an all new iconv cache. Also has the
+	beginnings of thread-safety but I'd really need to fix the
+	Makefiles to conditionally link with -lpthread before it'd be of
+	any value as well as needing to make gmime-charset.c's functions
+	thread-safe.
+
+2002-08-07  Jeffrey Stedfast  
+
+	* gmime-message.c (message_remove_header): If the header to be
+	removed is one of the special headers, then g_free() the cached
+	value on the message object and set it to NULL. Fixes bug #90138.
+
+2002-08-05  Jeffrey Stedfast  
+
+	* doc/*: Updated.
+
+	* gmime-multipart-signed.c (g_mime_multipart_signed_sign):
+	Documented.
+	(g_mime_multipart_signed_verify): Documented.
+
+	* gmime-filter-from.c (g_mime_filter_from_new): Updated the
+	documentation to explain the new mode argument.
+
+	* gmime-multipart-encrypted.c
+	(g_mime_multipart_encrypted_encrypt): Documented.
+	(g_mime_multipart_encrypted_decrypt): Documented.
+
+	* gmime-gpg-context.c (g_mime_gpg_context_get_always_trust):
+	Implemented.
+
+2002-08-04  Jeffrey Stedfast  
+
+	* doc/*: Updated.
+
+2002-08-03  Jeffrey Stedfast  
+
+	* gmime-message.c (g_mime_message_set_message_id): Revert Charles'
+	previous fix and just g_return_if_fail() if the message_id is NULL
+	instead.
+	(g_mime_message_set_subject): Same for NULL subjects.
+	(g_mime_message_set_reply_to): Here too.
+	(g_mime_message_set_sender): Again here.
+	(g_mime_message_add_header): Check that the value != NULL.
+	(g_mime_message_set_header): Same here.
+
+	* internet-address.c (decode_mailbox): Changed a for-loop into a
+	while-loop to make the code a tad easier to read. Also fixed a
+	type-o that meant to wrap a debug printf in d(). While we're at
+	it, g_strstrip the resulting comment before using it as the name
+	part of the address.
+
+2002-08-02  Jeffrey Stedfast  
+
+	* gmime-message-part.c: Fix some comments that say "message/*"
+	(which is meant as a wildcard mime-type match) and change them to
+	just "message" to prevent compiler warnings about a /* being
+	inside a comment.
+
+	* gmime-charset.c: Get rid of a #include "unicode.h". This is no
+	longer needed since we use glib2's unicode stuff.
+
+2002-08-02  Charles Kerr 
+
+	* gmime-message.c (gmime_message_foreach_part): if the message
+	isn't a multipart message, just invoke the callback directly,
+	passing in the single part.
+
+	* gmime-message.c (gmime_message_set_message_id): work around
+	a g_strstrip() warning if message_id is NULL.
+
+	* gmime-part.c (g_mime_part_get_content_object): remove "const"
+	from the retval; otherwise it's impossible to add a new filter.
+
+2002-07-31  Jeffrey Stedfast  
+
+	* gmime-filter-html.c (is_addr_char): Don't use "isprint(c)" to
+	mean "c >= 32 && c < 128" since it doesn't in most locales.
+	(is_url_char): Same.
+	(is_trailing_garbage): Same.
+	(is_domain_name_char): New macro for dns-valid characters
+	(email_address_extract): Use is_domain_name_char rather than
+	is_addr_char for the part after the @.
+
+2002-07-30  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_step_headers): Finish the fix from
+	yesterday, the last statement of the while-loop needs to
+	re-calculate `len' for parser_fill().
+
+2002-07-30  Charles Kerr 
+
+	* gmime-message.c (message_remove_header): Fix April 3 2002 bug
+	that kept message-remove-header from removing headers.
+
+2002-07-29  Jeffrey Stedfast  
+
+	* gmime-message.c (message_get_headers): Write the toplevel MIME
+	Part's headers to the string as well, this fixes bug #88632 in
+	bugzilla.gnome.org.
+
+2002-07-29  Jeffrey Stedfast  
+
+	The following changes are meant to address bug #88100 on
+	bugzilla.gnome.org - I'm as of yet unsure whether or not GMime
+	should override the Message-Id write function or if Pan should do
+	it. I'm sort of leaning towards Pan doing it simply because the
+	current behavior is RFC compliant and the bug is really a "we need
+	a workaround for a buggy NNTP server". However... It might just be
+	simpler to have GMime do it.
+
+	* gmime-header.c (g_mime_header_new): Init a new hash table that
+	stores info on how to write a particular header.
+	(g_mime_header_destroy): Free the hash table.
+	(g_mime_header_set_write_func): Set the writer function for a
+	header.
+	(g_mime_header_write_to_stream): Use the specified header write
+	function for each ehader. If one wasn't specified, use the
+	default.
+
+2002-07-29  Charles Kerr  
+
+	* remove strlib.[ch]
+	* use g_strcasecmp instead of strcasecmp
+	* use g_strncasecmp instead of strncasecmp
+	* use g_stpcpy instead of stpcpy
+	* added "#include " where needed
+
+2002-07-29  Charles Kerr  
+
+	* gmime-filter-strip: fix trivial compiler warning.
+	* gmime-message-part.c: same.
+	* gmime-multipart-signed.c: same.
+	* gmime-object.c: same.
+	* gmime-param.c: same.
+	* gmime-session.c: same.
+	* test-iconv.c: same.
+	* test-mbox.c: same.
+	* test-parser.c: same.
+	* test-partial.c: same.
+
+2002-07-29  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_step_headers): When refilling, make sure
+	that the refilled buffer is larger than the buffer was before
+	refilling, otherwise break out of the loop and parse whatever is
+	left. Fixes bug #89260 on bugzilla.gnome.org
+
+2002-07-27  Jeffrey Stedfast  
+
+	* gmime-stream-cat.c (stream_read): Initialize `n' at the
+	beginning of the while-loop so that it can't be used
+	uninitialized.
+
+	* gmime-parser.c (header_parse): Check to make sure that the
+	header was valid (ie, `colon' == ':'). If not, then set
+	header->value to "".
+
+2002-05-26  Charles Kerr 
+
+	* alloca.c: removed.
+	* gmime-charset.c: use g_alloca instead of alloca.
+	* gmime-filter-from.c: same.
+	* gmime-filter-strip.c: same.
+	* gmime-iconv.c: same.
+	* gmime-param.c: same.
+	* gmime-part.c: same.
+	* gmime-utils.c: same.
+	* memchunk.c: same.
+
+2002-07-21  Jeffrey Stedfast  
+
+	* gmime-filter-crlf.c (filter_filter): Fix to not add an extra \r
+	for pre-canonicalised streams.
+
+2002-07-19  Jeffrey Stedfast  
+
+	* gmime-iconv-utils.c (g_mime_iconv_strndup): Fix a logic mistake
+	in the calculation of the number of bytes converted.
+
+2002-07-18  Jeffrey Stedfast  
+
+	* gmime-part.c (set_disposition): Fix to parse the disposition
+	parameter values rather than assuming it is only the "attachment"
+	or "inline" part of the value.
+
+2002-07-14  Jeffrey Stedfast  
+
+	* configure.in: check for gmtime_r
+
+	* gmime-utils.c (g_mime_utils_header_format_date): Use gmtime_r() if
+	we have this function available to us.
+
+	* gmime-parser.c (parser_step_from): Save the From-line offset.
+	(g_mime_parser_get_from_offset): Newly implemented function used
+	for retrieving the offset of the From-line (for use when parsing
+	mbox files).
+
+2002-07-11  Jeffrey Stedfast  
+
+	* strlib.c (strlcpy): Changed to behave the same as the Solaris
+	strlcpy function.
+	(strlcat): Changed to behave the same as the Solaris strlcat
+	function.
+
+2002-07-04  Jeffrey Stedfast  
+
+	* gmime-iconv-utils.c (g_mime_iconv_strndup): Fix for
+	nul-terminating some multibyte charsets.
+
+2002-06-28  Jeffrey Stedfast  
+
+	* gmime-gpg-context.c (gpg_ctx_op_step): If we get an EOF from the
+	status-fd, then set gpg->complete to TRUE.
+	(gpg_ctx_get_argv): Use --charset=UTF-8 and --keyserver-options to
+	disable auto-key-retrieve rather than the deprecated
+	--no-auto-key-retrieve flag.
+
+2002-06-27  Jeffrey Stedfast  
+
+	* gmime-gpg-context.c (gpg_ctx_op_step): Loop on our reads while
+	errno is EINTR or EAGAIN. Also make sure to completely read stdout
+	and stderr by keeping better state.
+	(gpg_ctx_parse_status): If we encounted a NODATA error from gpg
+	and we have diagnostics output, use that as the exception string.
+	(gpg_ctx_op_exited): New function to determine if the gpg process
+	has exited.
+	(gpg_ctx_op_wait): Reuse any exit status information from
+	gpg_ctx_op_exited().
+	(gpg_verify): Check that the gpg process has not exited each loop.
+
+2002-06-26  Jeffrey Stedfast  
+
+	* gmime-multipart-signed.c (g_mime_multipart_signed_sign): Once
+	we've created the mime-part stream and armored the From lines and
+	such, create a new MIME part based on this stream (since normally
+	our QP encoder will not armor From lines) and use it as the
+	content part for this multipart/signed part rather than the
+	original MIME part.
+	(multipart_signed_write_to_stream): This can now be simplified by
+	calling our parent class's write_to_stream implementation since
+	g_mime_multipart_signed_sign() takes care of all the From
+	armoring.
+
+2002-06-26  Jeffrey Stedfast  
+
+	* test-pgpmime.c: New test suite for the pgp/mime code.
+
+	* gmime-gpg-context.c (gpg_ctx_parse_status): Handle a NODATA
+	status message from gpg.
+
+	* gmime-message.c (g_mime_message_new): Don't set NULL header
+	values via the g_mime_object_set_header interface.
+
+	* gmime-object.c (g_mime_object_add_header): Don't allow value == NULL.
+	(g_mime_object_set_header): Same.
+
+	* gmime.h.in: Updated to #include the new headers related to
+	encryption and digital signatures.
+
+	* gmime.c (g_mime_init): register the multipart/encrypted and
+	multipart/signed cclass types.
+
+	* gmime-multipart-signed.c: Fixed to compile cleanly.
+	(multipart_signed_write_to_stream): We need to handle writing out
+	the subparts ourselves because we need to armor From-lines.
+
+	* gmime-multipart-encrypted.c: Fixed to compile cleanly.
+
+2002-06-25  Jeffrey Stedfast  
+
+	* gmime-param.c (g_string_append_len_quoted): Append length as
+	advertised rather than appending the whole string. Oops.
+
+	* gmime-multipart-encrypted.c
+	(g_mime_multipart_encrypted_decrypt): Ugh, the
+	g_return_val_if_fail()'s should be returning NULL.
+
+	* test-pgp.c: New test suite to make sure that the gpg code works.
+
+	* gmime-gpg-context.c: Keep more state as it seems we needed
+	it. Also keep information such as trust level and whether the
+	signature was found to be valid and such (in case we ever decide
+	to use it).
+
+2002-06-24  Jeffrey Stedfast  
+
+	* gmime-multipart-signed.c (g_mime_multipart_signed_get_type):
+	Register as a subclass of a GMimeMultipart.
+
+	* gmime-multipart-encrypted.c
+	(g_mime_multipart_encrypted_get_type): Same.
+
+	* gmime-gpg-context.[c,h]: A new class implementing the
+	GMimeCipherContext interfaces for GnuPG.
+
+	* gmime-session.[c,h]: New abstract session class for use by the
+	cipher context classes for requesting passphrases/etc.
+
+	* gmime-cipher-context.c (g_mime_cipher_context_finalize): Unref
+	the gmime-session.
+
+2002-06-22  Jeffrey Stedfast  
+
+	* gmime-part.c: Oops, a prototype had the wrong return type.
+
+2002-06-19  Jeffrey Stedfast  
+
+	* gmime-multipart.c: Oops, some prototypes had the wrong return
+	type.
+
+2002-06-15  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_scan_mime_part_content): Use
+	g_mime_stream_mem_new_with_byte_array() so that the mem stream
+	owns the byte array so we don't leak.
+
+2002-06-12  Jeffrey Stedfast  
+
+	* gen-table.c: Updated.
+
+	* gmime-utils.c (quoted_decode): Oops. ESPECIALs are allowed
+	inside of the encoded-text section of the encoded-word.
+
+	* gmime-message.c (process_header): Add some NULL-protection.
+
+	* gmime-iconv.c (g_mime_iconv_open): If the from charset is
+	"x-unknown", replace it with the user's locale charset.
+
+2002-06-11  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_scan_mime_part_content): If the parser
+	stream is not seekable, then scan the content into a memory
+	stream.
+
+2002-06-09  Jeffrey Stedfast  
+
+	* gmime-2.0.pc.in: New file for use in pkg-config.
+
+	* gmime-filter-strip.[c,h]: New source files implementing a stream
+	filter for stripping trailing whitespace from lines (needed for
+	PGP/MIME).
+
+	* gmime-exception.[c,h]: New source files implementing generic
+	error reporting functionality.
+
+	* gmime-cipher-context.[c,h]: New abstract class for performing
+	common functionality (such as encryption, decryption, signing,
+	verifying, importing keys, and exporting keys) needed by any MIME
+	cipher suite (PGP/MIME and S/MIME specifically).
+
+	* gmime-multipart-signed.[c,h]: New source files implementing the
+	multipart/signed specification.
+
+	* gmime-multipart-encrypted.[c,h]: New source files implementing
+	the multipart/encrypted specification.
+
+2002-06-06  Jeffrey Stedfast  
+
+	* test-mbox.c (test_parser): Test the new set_header_regex
+	function.
+
+	* gmime-parser.c (g_mime_parser_set_header_regex): New convenience
+	function to allow an application to be notified when a header
+	matching a particular pattern is parsed by the
+	parser. Particularly useful for finding the Status: header when
+	parsing mbox files.
+
+2002-06-04  Jeffrey Stedfast  
+
+	* gmime-iconv-utils.c (g_mime_iconv_strndup): Pull up past fixes
+	from the gmime-1 branch.
+
+2002-06-02  Jeffrey Stedfast  
+
+	* gmime.c (g_mime_init): Register the message-part class.
+
+	* gmime-message-part.c: New class for handling message/* subparts.
+
+	* gmime-parser.c (parser_scan_message_part): Handle mime parts of
+	type message.
+	(parser_construct_leaf_part): Find out if the leaf part is
+	actually a message part.
+
+	* gmime-filter-from.c (g_mime_filter_from_new): Now takes a mode
+	argument to specify how "From "'s should be protected.
+	(filter_filter): If we are to armor the "From " then transform it
+	into "=46rom " otherwise transform it into the normal ">From ".
+
+2002-05-31  Jeffrey Stedfast  
+
+	* gmime/gmime-stream-cat.c (stream_read): Rewritten to work
+	correctly. This was broken worse than I could imagine :-)
+	(stream_write): Fix similarly.
+
+2002-05-30  Jeffrey Stedfast  
+
+	* gmime-stream-cat.c (stream_reset): Same.
+
+	* gmime-stream-file.c (stream_reset): Same.
+
+	* gmime-stream-fs.c (stream_reset): If the stream position is
+	already reset, just return 0.
+
+2002-05-23  Jeffrey Stedfast  
+
+	* doc/*: Updated documentation.
+
+2002-05-22  Jeffrey Stedfast  
+
+	* gmime-multipart.c (multipart_write_to_stream): Avoid adding an
+	extranious newline character when a preface doesn't exist.
+
+2002-05-20  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_set_content_md5): Fix some compiler
+	warnings as well as doing some more error handling.
+	(g_mime_part_verify_content_md5): Same.
+
+	* md5-utils.c: Removed some compiler warnings.
+
+2002-05-20  Jeffrey Stedfast  
+
+	* gmime-stream-cat.c (stream_seek): Return the absolute offset
+	into the cat stream rather than the relative offset of one of the
+	substreams on success. Fixed a few other things too.
+	(stream_read): Fix the logic here so that we never try reading
+	from a stream that is current at EOS.
+
+2002-05-16  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_scan_mime_part_content): Only compensate
+	for the '\n' if we found a boundary.
+
+2002-05-16  Charles Kerr 
+
+	* gmime-filter-yenc.c: fixed regression that caused end line of
+	yenc encoding to not be detected.  This was causing crc errors in Pan.
+
+2002-05-14  Jeffrey Stedfast  
+
+	* gmime-stream-filter.c (stream_destroy): Removed.
+
+2002-05-12  Jeffrey Stedfast  
+
+	* gmime-stream-cat.c (stream_read): Don't allow our caller to read
+	past the end of the stream.
+	(stream_write): Same.
+	(stream_seek): Don't forget to add the current source stream's
+	bound_start when seeking on the current source stream.
+
+	* gmime-message-partial.c (g_mime_message_partial_init): Zero our
+	extra fields.
+	(g_mime_message_partial_finalize): Cleanup strdup'd memory.
+	(message_partial_set_content_type): Implemented.
+	(g_mime_message_partial_class_init): Override set_content_type().
+	(g_mime_message_partial_get_id): Simplify.
+	(g_mime_message_partial_get_number): Simplify.
+	(g_mime_message_partial_get_total): Simplify.
+
+	* gmime-multipart.c (multipart_set_content_type): Implement.
+	(g_mime_multipart_class_init): Override set_content_type().
+
+	* gmime-object.c: Make set_content_type() virtual.
+
+2002-05-12  Jeffrey Stedfast  
+
+	* gmime-message-partial.c (partial_compare): Fixed to work
+	properly.
+
+2002-05-12  Jeffrey Stedfast  
+
+	* test-partial.c: New test suite for gmime-message-partial.c.
+
+	* gmime-stream-cat.c: Several fixes.
+	(g_mime_stream_cat_class_init): Overload the seek method.
+
+	* gmime-stream-mmap.c (g_mime_stream_mmap_class_init): Overload
+	the seek method.
+
+	* gmime-stream-buffer.c (g_mime_stream_buffer_class_init):
+	Overload the seek method.
+
+	* gmime-stream-null.c (g_mime_stream_null_class_init): Overload
+	the seek method.
+
+	* gmime-stream-filter.c (g_mime_stream_filter_class_init):
+	Overload the seek method.
+
+	* gmime-stream.c (g_mime_stream_class_init): Overload the seek
+	method.
+
+	* gmime-stream-mem.c (g_mime_stream_mem_class_init): Overload the
+	seek method.
+
+	* gmime-stream-file.c (g_mime_stream_file_class_init): Overload
+	the seek method.
+	(stream_length): The length of the stream is bound_end -
+	bound_start.
+
+	* gmime-stream-fs.c (g_mime_stream_fs_class_init): Overload the
+	seek method.
+	(stream_length): The length of the stream is bound_end -
+	bound_start.
+
+2002-05-10  Jeffrey Stedfast  
+
+	* gmime-stream-cat.c (stream_reset): Use stream_seek().
+	(stream_read): Seek to position before starting our read, this is
+	to protect against one of our source streams being read while we
+	weren't looking and/or a substream related to our cat stream.
+	(stream_write): Same.
+
+2002-05-09  Jeffrey Stedfast  
+
+	* gmime-message-partial.c: New class to handle MIME parts with a
+	content-type of message/partial.
+
+	* gmime.c (g_mime_init): Register the message/partial class.
+
+	* gmime-object.c (g_mime_object_new_type): If we fail to find an
+	appropriate mime object class, try falling back to the */*
+	handler. Only if that fails do we return NULL.
+
+2002-05-08  Jeffrey Stedfast  
+
+	* Makefile.am: Added gmime-stream-cat.c to the build.
+
+	* gmime-stream-cat.c: New stream that acts similar to the Unix
+	`cat` command by concatenating multiple streams.
+
+2002-05-07  Jeffrey Stedfast  
+
+	* gmime-stream-fs.c (stream_write): Do more error handling and
+	also try to write out everything.
+
+2002-05-02  Jeffrey Stedfast  
+
+	* gmime-charset.c (main): Generate the multibyte charsets without
+	the need for using external .dat files. Also attempt to condense
+	the charset-map table a bit.
+
+	* gen-multibyte.c: Removed.
+
+2002-04-30  Jeffrey Stedfast  
+
+	* gmime-charset.c (main): Instead of converting the multibyte
+	charset tables to UTF-8 and then using the unicode functions to
+	convert UTF-8 to UCS4, just convert directly to UCS4. Also fixed a
+	type-o in the Big5.dat filename (it should be Big5.dat not
+	Big5.data).
+
+2002-04-26  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_fill): Try to align the end of our
+	left-over buffer with realbuf + SCAN_HEAD so that we avoid: 1)
+	completely filling the prespace or 2) reading more than SCAN_BUF
+	bytes per read() call.
+
+2002-04-25  Jeffrey Stedfast  
+
+	* gmime-utils.c (g_mime_utils_base64_decode_step): Only backtrack
+	if we have output data.
+
+2002-04-23  Jeffrey Stedfast  
+
+	* gmime-utils.c (rfc2047_encode_phrase): Fixed a small memory
+	leak. Thanks to the Pan guys for finding this.
+
+2002-04-21  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_step_from): Fixes to make it work.
+	(g_mime_parser_eos): New function to tell if a parser is at the
+	end of it's stream.
+
+2002-04-20  Jeffrey Stedfast  
+
+	* docs/*: Updated.
+
+	* configure.in: Add $srcdir to the include path so it catches
+	iconv-detect.h.
+
+2002-04-18  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_step_headers): Take advantage of the same
+	optimization as parser_scan_content.
+
+2002-04-17  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_scan_content): Optimized by a good 15% by
+	simply changing my inner while-loop. See comment for explanation.
+
+	* gmime-part.c (g_mime_part_encoding_from_string): Added support
+	for the binary encoding.
+	(g_mime_part_encoding_to_string): Same.
+
+	* gmime-utils.h: Added GMIME_PART_ENCODING_BINARY.
+
+2002-04-17  Jeffrey Stedfast  
+
+	* gmime-parser.c (parser_scan_multipart_subparts): Don't leak
+	objects!
+
+2002-04-16  Jeffrey Stedfast  
+
+	* gmime-message.c (process_header): process the headers we care
+	about.
+	(message_add_header): Call process_header.
+	(message_set_header): Same.
+
+	* gmime-part.c (process_header): process the headers we care
+	about.
+	(mime_part_add_header): Call process_header.
+	(mime_part_set_header): Same.
+
+	* gmime-object (process_header): process the headers we care
+	about.
+	(add_header): Call process_header.
+	(set_header): Same.
+
+2002-04-15  Jeffrey Stedfast  
+
+	* gmime-parser.c (g_mime_parser_set_scan_from): New accessor
+	method to set whether or not to scan from-lines.
+	(g_mime_parser_get_scan_from): New accessor method to get the
+	from-line mode.
+
+2002-04-14  Jeffrey Stedfast  
+
+	* gmime-utils.c (datetok): Treat ',' as a token delimeter. Also
+	updated the datetok lookup table.
+
+	* configure.in: Check for off_t, size_t, and ssize_t.
+
+2002-04-15  Jeffrey Stedfast  
+
+	* gmime-parser.[c,h]: Brand spankin' new parser. Seems to work for
+	at least simple messages, needs a lot more love though.
+
+	* gmime-stream*.c: Don't use a base_class init or finalize.
+
+	* gmime-object.c: Same.
+
+	* gmime-part.c: Same here.
+
+	* gmime.c (g_mime_init): Call g_type_init.
+
+	* gmime-utils.c (g_mime_utils_header_fold): Slight bugfix to get
+	rid of extra whitespace at the end of a line.
+
+	* gmime-multipart.c (g_mime_multipart_set_preface): New accesor
+	function to set the multipart preface.
+	(g_mime_multipart_get_preface): New accesor function to get the
+	multipart preface.
+	(g_mime_multipart_set_postface): New accesor function to set the
+	multipart postface.
+	(g_mime_multipart_get_postface): New accesor function to get the
+	multipart postface.
+	(write_to_stream): Don't force a preface if we don't have one.
+
+2002-04-08  Jeffrey Stedfast  
+
+	* gmime-object.c: Don't tie the type-registry lifetime to the
+	GMimeObject lifetime.
+
+	* gmime.c (g_mime_init): Register our generic and multipart/* MIME
+	object classes here.
+
+	* gmime-part.c (g_mime_part_class_init): Don't register ourselves
+	here anymore.
+
+	* gmime-multipart.c (g_mime_multipart_class_init): Don't register
+	ourselves here anymore.
+
+2002-04-07  Jeffrey Stedfast  
+
+	* gmime-utils.c (g_mime_utils_uuencode_close): Fixed a bug that
+	crept in during my simplification.
+
+2002-04-07  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_set_content_id): Wrap the object
+	set_content_id.
+	(g_mime_part_get_content_id): Same.
+
+	* gmime-multipart.c
+	(g_mime_multipart_get_subpart_from_content_id): Compare the
+	object->content_id's.
+
+	* gmime-object.c (g_mime_object_set_content_id): New function
+	since the Content-Id should really be stored on the object class.
+	(g_mime_object_get_content_id): Same.
+	(set_header): If we are setting the Content-Id header, also set
+	our internal content_id member.
+	(add_header): Same.
+
+	* gmime-content-type.c (g_mime_content_type_set_parameter):
+	Renamed from g_mime_content_type_add_parameter.
+
+	* gmime-multipart.c (g_mime_multipart_new_with_subtype): New
+	convenience function.
+
+	* Makefile.am temporarily removed gmime-parser.c from the
+	build. It needs to be completely rewritten from scratch pretty
+	much.
+
+2002-04-06  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_add_subpart): Removed.
+	(g_mime_part_set_boundary): Removed.
+	(g_mime_part_get_boundary): Removed.
+
+	* gmime-object.c (g_mime_object_get_content_type_parameter): New
+	function.
+	(g_mime_object_set_content_type_parameter): New function.
+
+	* gmime-multipart.c (g_mime_multipart_new): New function, forgot
+	to implement it before ;-)
+	(multipart_set_boundary): Set the boundary parameter on the
+	content-type.
+
+2002-04-06  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_foreach): Removed.
+	(g_mime_part_get_subpart_from_content_id): Same.
+
+	* gmime-multipart.c (g_mime_multipart_foreach): Moved here from
+	gmime-part.c:g_mime_part_foreach since this is really only meant
+	to work on multiparts.
+	(g_mime_multipart_get_subpart_from_content_id): Same idea here too.
+
+	* gmime-object.c (g_mime_object_set_content_type): Move
+	g_mime_part_set_content_type up to the GMimeObject abstraction.
+	(g_mime_object_get_content_type): Same.
+
+2002-04-03  Jeffrey Stedfast  
+
+	* gmime-message.c: Initial port to GObject.
+
+2002-04-02  Jeffrey Stedfast  
+
+	* gmime-message.c (g_mime_message_add_recipients_from_string):
+	Destroy the temporary addrlist.
+
+2002-03-29  Jeffrey Stedfast  
+
+	* configure.in: Detect the iconv-friendly formats for iso charsets
+	at configure time and dump them into iconv-detect.h for use in
+	gmime-charset.c.
+
+	* gmime-charset.c: Updated to use iconv-detect.h if it exists.
+
+2002-03-25  Jeffrey Stedfast  
+
+	* gmime-multipart.c: Compile fixes.
+
+	* gmime-header.c (g_mime_header_write_to_stream): Now returns the
+	number of bytes written or -1 on fail.
+
+	* gmime-object.c: Compile fixes.
+
+	* gmime-stream-null.c (g_mime_stream_null_finalize): And finally
+	here.
+
+	* gmime-stream-mmap.c (g_mime_stream_mmap_finalize): Here too.
+
+	* gmime-stream-mem.c (g_mime_stream_mem_finalize): And again...
+
+	* gmime-stream-fs.c (g_mime_stream_fs_finalize): Again here.
+
+	* gmime-stream-filter.c (g_mime_stream_filter_finalize): Here too.
+
+	* gmime-stream-file.c (g_mime_stream_file_finalize): Same.
+
+	* gmime-stream-buffer.c (g_mime_stream_buffer_finalize): Call
+	GObject's finalize function.
+
+2002-03-24  Jeffrey Stedfast  
+
+	* memchunk.c: Make this compile.
+
+	* internet-address.c (decode_mailbox): No longer check
+	gmime_interfaces_utf8 as that was a hack in gmime-1's branch.
+
+	* gmime-charset.c (charset_step): Sync with the gmime-1 branch. We
+	now have multibyte charset detection.
+
+	* gmime-utils.c: Sync with gmime-1's changed.
+	(rfc2047_decode_word): Always convert decoded text to UTF-8.
+	(rfc2047_encode_phrase_get_words): We can always assume our input
+	is in UTF-8 now.
+	(rfc2047_encode_phrase): Sam here.
+	(g_string_append_len): Removed since glib2 now has this function.
+
+	* gmime-param.c (decode_param): Make sure the decoded text is
+	valid UTF-8.
+	(encode_param): Convert to the best charset before encoding.
+	(g_string_append_len): Removed since glib2 now has this function.
+
+	* gmime.c (g_mime_init): Initializes gmime. We no longer care
+	about GMIME_INIT_FLAGS_UTF8 as we now always use UTF-8 interfaces.
+
+2002-03-17  Jeffrey Stedfast  
+
+	* gmime-stream-null.c (g_mime_stream_null_get_type): Use
+	GMIME_TYPE_STREAM as our base class.
+	(g_mime_stream_null_class_init): Our parent class is a
+	GMIME_STREAM_CLASS, not a G_OBJECT_CLASS.
+	(g_mime_stream_null_finalize): Call our parent's finalize, which
+	is GMIME_STREAM_CLASS's finalize, not G_OBJECT_CLASS's finalize.
+
+	* gmime-stream-mmap.c: Same.
+
+	* gmime-stream-filter.c: Here too.
+
+	* gmime-stream-file.c: And here.
+
+	* gmime-stream-fs.c: Again here.
+
+	* gmime-stream-mem.c: And again...
+
+	* gmime-stream-buffer.c: And finally here.
+
+	* gmime-multipart.[c,h]: New class that inherits from GMimeObject
+	that represents a MIME multipart.
+
+2002-03-17  Jeffrey Stedfast  
+
+	* gmime-object.c: Ported to glib2 by subclassing GObject and also
+	added a GMimeHeader data member and methods to access those
+	headers as well as adding abstract methods for getting the headers
+	as one big string buffer and writing the object headers/content to
+	a stream.
+
+	* gmime-stream-*.c (*_class_init): Don't set a destroy handler -
+	we can't, we don't have a virtual function pointer for it!
+
+	* gmime-stream.c (g_mime_stream_substream): Use GET_CLASS since we
+	are passing in an object.
+	(g_mime_stream_length): Same.
+	(g_mime_stream_tell): Here too.
+	(g_mime_stream_seek): And here.
+	(g_mime_stream_reset): And again here.
+	(g_mime_stream_eos): Again.
+	(g_mime_stream_close): Here too.
+	(g_mime_stream_flush): Same.
+	(g_mime_stream_write): Same here.
+	(g_mime_stream_read): And finally here.
+	(g_mime_stream_class_init): Setup default implementations of all
+	the stream methods. Also no longer set a destroy handler.
+
+	* gmime-stream-buffer.[c,h]: Updated to subclass the new
+	GMimeStream based on GObject.
+
+2002-03-16  Jeffrey Stedfast  
+
+	* gmime-stream-filter.[c,h]: Updated to subclass the new
+	GMimeStream based on GObject.
+
+	* gmime-stream-fs.[c,h]: Updated to subclass the new GMimeStream
+	based on GObject.
+
+	* gmime-stream-file.[c,h]: Updated to subclass the new GMimeStream
+	based on GObject.
+
+	* gmime-stream-mmap.[c,h]: Updated to subclass the new GMimeStream
+	based on GObject.
+
+	* gmime-stream-null.[c,h]: Updated to subclass the new GMimeStream
+	based on GObject.
+
+	* gmime-stream-mem.[c,h]: Updated to be based on the new
+	implementation of GMimeStream.
+
+	* gmime-type-utils.h: New file to contain some more-friendly
+	type-cast macros around the glib2 ones.
+
+	* gmime-stream.[c,h]: Now subclasses GObject. Not sure if I got
+	everything right, but I think it's mostly there?
+
+2002-03-15  Charles Kerr 
+
+	* gmime-filter-charset.c: fixed minor compiler warnings.
+	* gmime-iconv-utils.c: same.
+	* test-html.c: same.
+	* test-iconv.c: same.
+	* test-mime.c: same.
+	* test-streams.c: same.
+
+2002-03-15  Jeffrey Stedfast  
+
+	* gmime-utils.c (g_mime_utils_uudecode_step): Fixed a logic
+	mistake. All is good now in the land of UU :-)
+
+2002-03-15  Charles Kerr 
+
+	Syncing up with small changes from Pan...
+
+	* gmime-content-type.c: remove unused #include 
+	* gmime-message.c: same.
+	* gmime-part.c: same.
+	* internet-address.c: same.
+
+	* gmime-filter-basic.c: add #include  (strncmp)
+	* gmime-filter-yenc.c: add #include  (strncmp)
+	* gmime-iconv-utils.c: add #include  (strlen)
+	* gmime-iconv.c: add #include  (strlen)
+	* gmime-iconv.c: add #include  (sprintf)
+	
+2002-03-14  Jeffrey Stedfast  
+
+	* gmime-filter-yenc.c (filter_reset): Added a switch-statement
+	based on direction. Yes, for now the INIT state for encode/decode
+	are both the same but this may change? Probably not but oh well
+	:-)
+	(g_mime_ydecode_step): Sync up with Charles' yenc fixes.
+
+2002-03-13  Jeffrey Stedfast  
+
+	* gmime-filter-yenc.c: Compile fixes.
+
+2002-03-12  Jeffrey Stedfast  
+
+	* gmime-filter-yenc.c (g_mime_filter_yenc_get_pcrc): Finalize the
+	crc before returning.
+	(g_mime_filter_yenc_get_crc): Same.
+
+2002-03-12  Jeffrey Stedfast  
+
+	* gmime-filter-yenc.c: New filter to encode/decode yEnc streams.
+
+2002-03-03  Jeffrey Stedfast  
+
+	Thanks to Carlos Morgado 
+
+	* gmime.spec.in: Fix.
+
+2002-03-03  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_write_to_stream): Get rid of some
+	extra line feeds.
+
+2002-02-21  Jeffrey Stedfast  
+
+	* doc/*: Updated.
+
+	* configure.in: Updated version to 0.8.0
+
+2002-01-25  Jeffrey Stedfast  
+
+	* gmime-charset.c (g_mime_charset_name): Updated for AIX, HPUX,
+	IRIX, and Sun systems.
+
+2002-01-24  Jeffrey Stedfast  
+
+	* gmime-iconv.c (iconv_cache_bucket_add_node): Fixed an oops.
+	(iconv_cache_bucket_get_first_unused): Fixed another oops.
+
+2002-01-20  Jeffrey Stedfast  
+
+	* gmime-data-wrapper.c (g_mime_data_wrapper_write_to_stream):
+	Handle the x-uuencode encoding type.
+
+	* gmime-utils.c (g_mime_utils_uuencode_close): No longer needs a
+	uulen argument since it is now compacted into the state argument.
+	(g_mime_utils_uuencode_step): Same here.
+
+	* gmime-filter-basic.c (filter_filter): Ignore data until we have
+	found the "begin" line. Also, we no longer need uulen.
+	(filter_complete): Same.
+
+	* gmime-part.c (g_mime_part_encoding_to_string): Handle
+	x-uuencode.
+	(g_mime_part_encoding_from_string): Same.
+	(g_mime_part_set_pre_encoded_content): Here too.
+	(write_content): And again here.
+
+2002-01-19  Jeffrey Stedfast  
+
+	* gmime-iconv.c (iconv_node_new): Return the node - how did I miss
+	this!?
+
+2002-01-18  Jeffrey Stedfast  
+
+	* configure.in: Fixed more silliness.
+
+	* acconfig.h: Added #undef's for some iconv stuff.
+
+	* gmime-filter-charset.c (g_mime_filter_charset_new): Put the
+	charset arguments in the right order.
+
+	* gmime-iconv.c (g_mime_iconv_open): Swap the to/from arguments so
+	that they are in the same order as iconv_open.
+
+	* gmime-iconv-utils.c (iconv_utils_init): Put the to/from
+	arguments in the right order.
+
+2002-01-17  Jeffrey Stedfast  
+
+	* gmime-iconv-utils.c (g_mime_iconv_strndup): If we get an EILSEQ,
+	just return NULL rather than g_strndup'ing the original
+	string. We'd rather get back NULL and know it failed than get back
+	a string thinking everything went okay.
+
+	* configure.in: Fixed some silliness, thanks to Charles Schmidt.
+
+2002-01-16  Jeffrey Stedfast  
+
+	* gmime-iconv-utils.c (g_mime_iconv_strndup): New utility function
+	to iconv n bytes of a string and return a buffer containing the
+	converted string.
+	(g_mime_iconv_strdup): Same but for the whole string.
+	(g_mime_iconv_locale_to_utf8): Converts a string in the locale
+	charset to utf8.
+	(g_mime_iconv_locale_to_utf8_length): Same but for a sublength of
+	the string.
+	(g_mime_iconv_utf8_to_locale): Converts a string from utf8 to the
+	locale charset.
+	(g_mime_iconv_utf8_to_locale_length): Same but for a sublength of
+	the string.
+
+2002-01-15  Jeffrey Stedfast  
+
+	* test-iconv.c: test suite to make sure that the gmime-iconv cache
+	works.
+
+	* gmime-iconv.c (g_mime_iconv_init): Initialize the iconv_node
+	memchunk.
+	(g_mime_iconv_shutdown): Destroy the iconv_node memchunk.
+	(iconv_node_destroy): Use memchunk_free instead of g_free.
+	(iconv_node_new): Use memchunk_alloc.
+	(iconv_node_set_used): Add/Remove the node to the iconv_open_hash.
+
+2002-01-14  Jeffrey Stedfast  
+
+	* configure.in: Bumped the version to 0.7.7
+
+	* doc/*: Updated to document the new gmime-iconv interfaces.
+
+	* gmime-filter-charset.c (g_mime_filter_charset_new): Use
+	g_mime_iconv_open instead of iconv_open. Also no longer need to
+	use g_mime_charset_name() since gmime-iconv does this for us.
+	(filter_destroy): Use g_mime_iconv_close() instead of
+	iconv_close().
+
+	* gmime-iconv.c (g_mime_iconv_open): New wrapper around
+	iconv_open() so that we can cache the results. This'll be a major
+	speedup for systems like Solaris where iconv_open() must dlopen a
+	module for each of the charsets. Also uses g_mime_charset_name()
+	to get the iconv-friendly charset name for you.
+	(g_mime_iconv_close): New wrapper around iconv_close().
+
+2002-01-13  Jeffrey Stedfast  
+
+	* configure.in: Bumped version to 0.7.6
+
+	* doc/*: Updated to document the new charset code.
+
+	* gmime.h.in: Added #includes for gmime-charset.h and
+	gmime-filter-charset.h.
+
+	* gmime-filter-charset.c: New filter for converting text between
+	charsets using iconv.
+
+	* gmime-charset.c (g_mime_charset_name): New function to derive
+	the iconv-friendly name for a given charset.
+
+2002-01-09  Charles Kerr 
+
+	* internet-address.c (internet_address_list_prepend): replaced
+	"g_return_if_fail" with "g_return_val_if_fail".
+	* internet-address.c (internet_address_list_append): same.
+
+	* internet-address.c (internet_address_set_group): removed
+	unused variables to shut up compiler.
+	* gmime-param.c (rfc2184_decode): same.
+
+2002-01-08  Jeffrey Stedfast  
+
+	* config.h.in: Added a #include  if HAVE_ALLOCA_H is
+	defined - this limits the number of places I have to conditionally
+	add #include  in the source files.
+
+2002-01-05  Jeffrey Stedfast  
+
+	* gmime-utils.c (parse_broken_date): Implemented.
+
+2002-01-04  Jeffrey Stedfast  
+
+	* memchunk.c (memchunk_clean): Oops, when tree_search() returns 0
+	we want to prune it, not the other way around :-)
+
+2002-01-02  Jeffrey Stedfast  
+
+	* memchunk.c (memchunk_clean): Fixed a logic mistake that
+	prevented pruning of the head node.
+
+2002-01-01  Charles Kerr 
+
+	* gmime-message (g_mime_message_get_body): added g_return_val_if_fail
+	checks in the entry point.
+
+2001-12-31  Jeffrey Stedfast  
+
+	* internet-address.c (decode_address): Optimized group parsing.
+
+	* doc/*: Updated.
+
+2001-12-31  Jeffrey Stedfast  
+
+	* strlib.c (strncasecmp): Convert the chars to lowercase before
+	diffing.
+
+2001-12-30  Jeffrey Stedfast  
+
+	* configure.in: Bumped version number to 0.7.5 since the
+	internet-address API and bits of the gmime-message API have
+	changed.
+
+	* internet-address.c (internet_address_new): Initialize the
+	refcount to 1.
+	(internet_address_destroy): This is now an internal function.
+	(internet_address_ref): New function to ref an InternetAddress
+	object.
+	(internet_address_unref): New function to unref an InternetAddress
+	object.
+	(internet_address_set_group): Updated to use the new
+	internet_address_list functions.
+	(internet_address_add_member): Same.
+	(internet_address_list_prepend): New function to manipulate a list
+	of InternetAddress objects.
+	(internet_address_list_append): Same.
+	(internet_address_list_concat): Another new function.
+	(internet_address_list_length): Again...
+	(internet_address_list_destroy): Destroy a list of addresses.
+	(internet_address_list_to_string): New utility function to write a
+	list of addresses to a string.
+	(internet_address_parse_string): Optimized slightly by not using
+	GLists' generic append function and also updated to use
+	InternetAddressList.
+
+	* gmime-message.c (recipients_destroy): Updated to call
+	internet_address_list_destroy.
+	(sync_recipient_header): Updated to let the InternetAddress code
+	do the work for us.
+	(g_mime_message_add_recipient): Updated to use the new
+	InternetAddress API.
+	(g_mime_message_add_recipients_from_string): Same.
+	(g_mime_message_get_recipients): Return an InternetaddressList
+	instead of GList.
+
+2001-12-30  Jeffrey Stedfast  
+
+	* strlib.c (strncasecmp): Do null-checking.
+
+	* TODO: Remove features that have already been
+	implemented/fixed/whatever.
+
+2001-12-30  Jeffrey Stedfast  
+
+	* memchunk.c (memchunk_clean): Prune 'cleaned' nodes from our
+	free-node list. Thanks to Charles Kerr for discovering this bug.
+
+	* strlib.c (strncasecmp): Moved the return calculation to within
+	the loop so as to only take a difference if the strings are not
+	identical. This also fixes a bug that would falsely return
+	non-zero for strings that were identical for the first n bytes.
+
+2001-12-20  Jeffrey Stedfast  
+
+	* gmime-stream.c (g_mime_stream_construct): 'type' is now an
+	unsigned int rather than a signed int.
+
+	* memchunk.c (memchunk_clean): Oops. Don't forget to free the tree
+	after we're finished with it...
+
+2001-12-18  Jeffrey Stedfast  
+
+	Various compiler warning fixes to several source files (mostly
+	"unused variable" type stuff).
+
+2001-12-17  Jeffrey Stedfast  
+
+	* gmime-utils.c (datetok): reimplement to not use GLists
+	(appending is slow) and also to not g_strndup the token, instead
+	just remember it's offset and length so we can examine it later.
+	(decode_int): New function to decode an int.
+	(get_wday): Now takes an inlen argument.
+	(get_mday): Same. Also calls decode_int.
+	(get_month): Here too.
+	(get_year): Again here... also calls decode_int.
+	(get_tzone): Modified to use struct _date_token.
+	(get_time): Completely rewritten.
+
+2001-12-16  Jeffrey Stedfast  
+
+	* memchunk.[c,h]: A memchunk library similar to g_mem_chunk's but
+	faster.
+
+2001-12-16  Jeffrey Stedfast  
+
+	* configure.in: Added a --enable-warnings to turn on compiler
+	warnings.
+
+	* gmime-utils.c: Various compiler warning cleanup.
+
+	* gmime-object.c (g_mime_object_construct): Change the type
+	argument to be of type unsigned rather than int.
+
+	* gmime-filter-html.c (url_extract): g_strndup takes an unsigned
+	length argument.
+
+	* gmime-filter-from.c (filter_filter): memcpy takes an unsigned
+	length argument.
+
+	* gmime-disposition.c (g_mime_disposition_new): g_strndup takes an
+	unsigned length argument.
+
+	* gmime-content-type.c (g_mime_content_type_new_from_string):
+	g_strndup takes an unsigned length argument.
+
+	* gmime-charset.c (g_mime_charset_init): g_strndup takes an
+	unsigned length argument.
+
+2001-12-16  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_destroy): Now an internal-only method.
+
+	* gmime-message.c (g_mime_message_destroy): Now an internal-only
+	method.
+
+2001-12-05  Jeffrey Stedfast  
+
+	* gmime-filter-basic.c (filter_filter):
+	(filter_complete): The outbuf for QP decoding can be up to len + 2
+	bytes and UU decoding outbuf can be up to len + 3 bytes.
+
+2001-12-01  Jeffrey Stedfast  
+
+	* gmime-parser.c (parse_content_headers): Set is_multipart to
+	FALSE.
+	(g_mime_parser_construct_part_internal): Get the inlen properly
+	and do content-offsetting a little better by skipping past the
+	end-of-header marker.
+
+	* gmime-stream-buffer.c (g_mime_stream_buffer_gets): Use the
+	'register' keyword for some variables.
+
+	* gmime-data-wrapper.c (g_mime_data_wrapper_set_stream): Safeguard
+	against NULL streams.
+	(g_mime_data_wrapper_write_to_stream): Reset the stream before
+	writing too.
+
+	* gmime-stream-mem.c (stream_seek): Fix to work like the others.
+	(stream_read): On error, always return -1 (and not just any value
+	less than 0)
+	(stream_write): Same.
+
+2001-11-30  Jeffrey Stedfast  
+
+	* gmime-part.c (write_content): Implemented a slight optimization
+	which bypasses the need to do any encoding in certain
+	circumstances.
+
+2001-11-28  Jeffrey Stedfast  
+
+	* pan-mime-parser.c (parser_read_until_boundary): Make sure
+	boundary is non-NULL before calling strlen on it.
+
+2001-11-26  Jeffrey Stedfast  
+
+	* gmime-parser.c (g_mime_parser_construct_part_internal): Fixed a
+	bug - don't set bounds on the original stream, set the bounds on
+	our temporary memory stream. Also got rid of find_header_end().
+
+	* gmime-filter-from.c (filter_filter): initialize fromcount to 0.
+
+2001-11-25  Jeffrey Stedfast  
+
+	* strlib.c (strlcpy): BSD defines the prototype as returning
+	size_t, the strlen of the resultant string.
+	(strlcat): Same.
+
+	* gmime-stream-buffer.c (stream_flush): Oops, memmove the buffer
+	too and a smidgen of code cleanup.
+	(stream_reset): Fix reset for block write mode.
+
+	* configure.in: Bumped the version to 0.7.4 and added checks for
+	system mmap functions.
+
+	* gmime-stream-mmap.[c,h]: New stream that uses an mmaped buffer.
+
+2001-11-24  Jeffrey Stedfast  
+
+	* doc/gmime-docs.sgml: Added documentation of the use of filters.
+
+2001-11-23  Jeffrey Stedfast  
+
+	* gmime-stream-buffer.c (stream_seek): Implemented.
+
+	* gmime-parser.c (parse_content_headers): Fixed another memory
+	leak here.
+
+	* gmime-param.c (decode_param_list): Fixed a small memory leak.
+
+2001-11-22  Jeffrey stedfast  
+
+	* gmime-filter-from.[c,h]: New filter to escape from-lines.
+
+	* pan-mime-parser.c (parser_read_until_boundary): Slight
+	optimization.
+
+2001-11-21  Jeffrey Stedfast  
+
+	* gmime-utils.c (is_8bit_word_encoded): Make into a macro, we
+	don't need to do a strlen because the atom is a GString which
+	means we have it's length already. This also saves us some
+	overhead of calling a function.
+	(g_mime_utils_8bit_header_decode): Update to pass the len argument
+	to is_8bit_word_encoded.
+
+2001-11-18  Jeffrey Stedfast  
+
+	* configure.in: Bumped version to 0.7.3
+
+	* gmime-param.c: GMimeParam is now a linked list of parameters
+	rather than a single name/value pair.
+	(g_mime_param_new_from_string): Now returns a parameter list based
+	on the input string rather than only returning a single parameter
+	name/value pair. Also updated to handle rfc2184 encoded
+	parameters.
+	(g_mime_param_destroy): Destroy the linked list of params.
+	(g_mime_param_append): Append a new parameter.
+	(g_mime_param_append_param): Append a new parameter object.
+	(g_mime_param_write_to_string): New function (which replaces
+	g_mime_param_to_string) which correctly encodes (either by quoting
+	the value or rfc2184 encoding it) the list of parameters and
+	optionally folds them suitable for header wrapping.
+
+	* gmime-disposition.[c,h]: New source files to handle
+	parsing/generating Content-Disposition headers.
+
+	* gmime-part.c (g_mime_part_destroy): Updated to use
+	g_mime_disposition_destroy.
+	(g_mime_part_set_content_disposition_object): New function for
+	setting the disposition object on a mime part.
+	(g_mime_part_set_content_disposition): Updated to use
+	g_mime_disposition_set.
+	(g_mime_part_get_content_disposition): Updated to use
+	g_mime_disposition_get.
+	(g_mime_part_add_content_disposition_parameter): Updated to use
+	g_mime_disposition_add_parameter.
+	(g_mime_part_get_content_disposition_parameter): Updated to use
+	g_mime_disposition_get_parameter.
+	(g_mime_part_set_filename): Updated to use
+	g_mime_disposition_add_parameter.
+	(g_mime_part_get_filename): Updated to use
+	g_mime_disposition_get_parameter.
+
+	* gmime-content-type.c (g_mime_content_type_new_from_string): Use
+	the gmime-param code to parse any Content-Type parameters.
+	(g_mime_content_type_destroy): Updated to use
+	g_mime_param_destroy.
+	(g_mime_content_type_add_parameter): Updated to use g_mime_param
+	functions.
+
+	* gmime-utils.c (g_mime_utils_header_fold): Fixed a small header
+	folding bug.
+
+	* gmime-parser.c (parse_content_headers): Updated to use the
+	GMimeDisposition parser.
+
+	* pan-mime-parser.c (parse_content_headers): Updated to use the
+	GMimeDisposition parser.
+
+2001-11-16  Jeffrey Stedfast  
+
+	* configure.in: Bumped version to 0.7.2 due to the change-over to
+	refcounted mime objects.
+
+	* gmime-object[c,h]: New source files that implement an abstract
+	Object class.
+
+	* gmime-message.c: Updated to subclass GMimeObject
+
+	* gmime-part.c: Updated to subclass GMimeObject
+	(g_mime_part_set_content_header): Set an arbitrary mime content
+	header.
+	(g_mime_part_get_content_header): Get an arbitrary mime content
+	header.
+	(g_mime_part_add_child): Finally deprecated, please use
+	g_mime_part_add_subpart instead if you aren't already.
+
+	* gmime-parser.c: Updated to unref mime parts where appropriate as
+	well as set unknown content headers on mime parts.
+
+	* pan-mime-parser.c: Same as gmime-parser.c
+
+2001-11-14  Jeffrey Stedfast  
+
+	* gmime-stream-null.c (g_mime_stream_null_new): A new stream,
+	similar to /dev/null basically.
+
+2001-11-10  Jeffrey Stedfast  
+
+	* configure.in: Added checks for strlib functions and bumped the
+	version to 0.7.1 (there won't be an official 0.7.1 release but I
+	figure I should be bumping version numbers whenever I add
+	functionality).
+
+	* strlib.[c,h]: New string library that provides anything that the
+	system libc doesn't (includig strnstr and stpcpy).
+
+	* gmime-filter-html.[c,h]: New filter that converts plain text
+	into HTML suitable for display in things like GtkHTML (makes urls
+	into hyperlinks and preserves whitespace and such).
+
+	* gmime-parser.c (g_strstrbound): Removed.
+	(find_header_part_end): Use strnstr.
+	(g_mime_parser_construct_part_internal): Use strnstr.
+
+2001-10-26  Jeffrey Stedfast  
+
+	* configure.in: Updated the version to 0.7.0
+
+	* doc/*: Updated.
+
+2001-10-25  Jeffrey Stedfast  
+
+	* gmime-message.c (g_mime_message_new): Now takes an
+	"init_headers" argument, it doesn't really matter what value you
+	put here - it's more a "I want my message headers to be in a nice
+	friendly order rather than the order they are set in".
+
+	* gmime-parser.c (g_mime_parser_construct_message): Use
+	!preserve_headers as the init_headers argument to
+	g_mime_message_new ().
+
+	* pan-mime-parser.c (g_mime_parser_construct_message): Same.
+
+2001-10-24  Jeffrey Stedfast  
+
+	* pan-mime-parser.c (construct_message_headers): Use
+	g_mime_header_add instead of g_mime_header_set so we can get
+	multiple of the same header (such as "Received:").
+
+	* gmime-parser.c (construct_headers): Use g_mime_header_add
+	instead of g_mime_header_set so we can get multiple of the same
+	header (such as "Received:") and also move it into the switch
+	statement into the default case.
+
+	* gmime-message.c (g_mime_message_set_header): New function to add
+	a header to a message.
+
+	* gmime-header.c (g_mime_header_add): New function to add a
+	header.
+
+	* gmime-stream.c (g_mime_stream_writev): New function to write a
+	vector to a stream.
+
+2001-10-21  Jeffrey Stedfast  
+
+	* pan-mime-parser.c: Updated to use g_mime_stream_buffer_readln.
+
+	* gmime-stream-buffer.c (g_mime_stream_buffer_readln): New
+	convenience function to read a single line from a stream.
+
+2001-10-12  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_write_to_stream): No longer takes a
+	'toplevel' argument.
+	(g_mime_part_to_string): No longer takes a 'toplevel' argument.
+
+	* gmime-message.c (g_mime_message_write_to_stream): Write the
+	MIME-Version header here instead of needing to pass a 'toplevel'
+	argument to g_mime_part_write_to_stream().
+
+	* gmime-charset.c (g_mime_charset_init): Fix for Debian and
+	Solaris.
+
+2001-10-09  Charles Kerr 
+
+	* gmime-filter.c (g_mime_filter_construct): make sure outptr is
+	zeroed out before we read it in g_mime_filter_set_size().
+
+2001-10-06  Jeffrey Stedfast  
+
+	* gmime-filter-basic.c (filter_filter): Implemented uuencoding.
+	(filter_complete): Implemented uuencoding.
+
+	* gmime-utils.c (g_mime_utils_uuencode_close): New function to
+	flush the uuencoder.
+	(g_mime_utils_uuencode_step): New function to uuencode a block of
+	data.
+
+2001-10-05  Jeffrey Stedfast  
+
+	Fixes for c++ compilation
+
+	* gmime-stream*.c: s/template/stream_template
+
+	* gmime-filter*.c: s/template/filter_template
+
+2001-10-04  Jeffrey Stedfast  
+
+	* gmime-data-wrapper.c (g_mime_data_wrapper_set_stream): If we
+	just change the order of operations, we can get away without a
+	second stream pointer.
+
+	* gmime-stream.c (g_mime_stream_substream): Revert.
+
+	* gmime-stream-buffer.c (stream_substream): Instead of calling
+	g_mime_stream_substream(), call the source stream's substream
+	method directly. I think this is the better fix for the bug
+	Charles just fixed.
+
+2001-10-04  Charles Kerr 
+
+	* gmime-stream.c (g_mime_stream_substream): fix refcount stealth
+	bug.  Calling this on a buffered stream wound up reffing two
+	streams instead of one because of a nested call to
+	g_mime_stream_substream().  This took a lot of scaffolding to
+	find. :)
+
+	* gmime-data-wrapper.c (g_mime_data_wrapper_set_stream): fix
+	refcount paranoia bug.  ref the new *before* unreffing the old
+	just in case new==old.
+	
+	* gmime-filter-basic.[ch]: fix some compiler warnings that I
+	introduced yesterday.  (Strange how the same version of gcc finds
+	different warnings on different platforms.)
+
+2001-10-03  Charles Kerr 
+
+	* gmime-part.c (g_mime_part_get_content): bugfix for when getting
+	the content from a stream-mem.  We were just returning the
+	stream-mem's gbytearray buffer, but we need to check against the
+	stream's bounds.
+
+	* gmime-filter-basic.[ch]: added support for decoding a uuencoded
+	stream; added a placeholder for uuencoding a stream.
+
+	* md5-utils.c: commented out d(x) macro.
+
+2001-10-02  Jeffrey Stedfast  
+
+	* gmime-stream-buffer.h: buflen should be an ssize_t not a
+	size_t. Thanks to Charles for catching this.
+
+2001-10-01  Charles Kerr 
+
+	* gmime-filter.c: include  to pick up memcpy prototype.
+	* gmime-stream-mem.c: same.
+	* gmime-stream-buffer.c: same.
+	* gmime-stream-filter.c: same.
+
+	* gmime-stream-mem.c (stream_flush): added a retval of 0.
+
+	* gmime-filter-crlf.h (g_mime_filter_crlf_new_type): renamed
+	prototype as g_mime_filter_crlf_new to sync with .c
+
+	* gmime-part.h: added g_mime_part_set_content_object() prototype.
+
+	* gmime-content-type.h: Replaced <> with "" in #include
+	
+
+	* pan-mime-parser.c: added #include gmime-stream-buffer.h to pick
+	up prototype for g_mime_stream_buffer_gets.
+	(g_strstrbound): removed unused func.
+
+	* gmime-utils.c: on calls to ctype functions, explicitly upcast
+	the char arguments as ints to shut up gcc warnings on Solaris.
+	* gmime-param.c: same.
+
+2001-09-29  Jeffrey Stedfast  
+
+	* pan-mime-parser.c: New parser (with exactly the same API as
+	gmime-parser.c) that is meant to parse MIME objects without
+	needing them to be memory mapped. Quite a bit slower on average,
+	but is vastly sped up by using a GMimeStreamBuffer in BLOCK_READ
+	mode.
+
+	* gmime-stream-buffer.c (stream_write): Incremement the stream
+	position by the number of bytes we wrote.
+	(stream_tell): Return stream->position.
+	(stream_substream): Just return a substream of our source stream.
+	(g_mime_stream_buffer_gets): Increment the stream position by the
+	number of bytes read if and only if we are operating on a buffered
+	stream.
+
+2001-09-27  Jeffrey Stedfast  
+
+	* gmime-stream-file.c (stream_tell): Return stream->position here
+	too.
+
+	* gmime-part.c (g_mime_part_set_pre_encoded_content): Don't decode
+	into a stream and then set the data wrapper encoding to the
+	incoming encoding type, instead use filters to decode into the
+	stream and set the data wrapper encoding to the default.
+
+	* gmime-stream.c (g_mime_stream_set_bounds): Don't set the
+	position equal to end if end == -1.
+
+	* gmime-parser.c (g_mime_parser_construct_message): Use the stream
+	functions to find the beginning and end of the stream rather than
+	breaking abstractions. Also reset the mem stream after writing to
+	it.
+	(g_mime_parser_construct_part): Reset the mem stream here too.
+	(g_mime_parser_construct_part_internal): Use the stream interfaces
+	to get the position instead of breaking abstractions.
+
+	* gmime-stream-fs.c (stream_tell): Return stream->position.
+
+	* gmime-stream-mem.c (stream_seek): Return the new syteam
+	position.
+	(stream_tell): Return stream->position.
+
+2001-09-23  Jeffrey Stedfast  
+
+	* doc/gmime-docs.sgml: Documented streams.
+
+	* gmime-stream-fs.c (stream_write): Seek to the position we think
+	we're at before attempting to write, and increment the stream
+	position after the write.
+
+	* gmime-stream-file.c (stream_write): Seek to the position we
+	think we're at... this is just in case we are or have substreams
+	that might have read or written in the meantime. Also remember to
+	increment the stream position after the write.
+	(stream_eos): Only return feof() if our end boundary is unlimited.
+
+	* gmime-stream-mem.c (stream_write): Start writing data at
+	stream->position rather than always appending it to the end of the
+	mem stream. Also don't go writing past the end boundary if it's
+	set.
+	(stream_length): Use a relative bound_end.
+	(stream_seek): Same.
+	(stream_eos): Here too.
+	(stream_write): And here.
+	(stream_read): And here.
+	(stream_substream): Correctly set the bounds.
+	(g_mime_stream_mem_new): Here too.
+	(g_mime_stream_mem_new_with_byte_array): And here.
+	(g_mime_stream_mem_new_with_buffer): Same.
+	(g_mime_stream_mem_set_byte_array): And finally here.
+
+2001-09-22  Jeffrey Stedfast  
+
+	* test-streams.c: New test suite for streams.
+
+	* gmime-stream-buffer.c (stream_read): Fixed some logic bugs
+	(including forgetting a break statement at the end of a case).
+	(g_mime_stream_buffer_gets): Fixed some logic bugs.
+
+	* gmime-stream-mem.c (stream_read): Fixed logic error.
+
+2001-09-21  Jeffrey Stedfast  
+
+	* gmime-stream-buffer.c (g_mime_stream_buffer_gets): Implemented.
+	(stream_reset): Implemented.
+	(stream_eos): Implemented.
+	(stream_write): Reimplemented.
+	(stream_read): Reimplemented.
+
+2001-09-21  Jeffrey Stedfast  
+
+	* gmime-stream-buffer.[c,h]: New stream that buffers reads or
+	writes to/from another stream. Will also implement a gets() method
+	for Charles.
+
+2001-09-20  Jeffrey Stedfast  
+
+	* gmime-stream-mem.c (stream_eos): Check for position >= instead
+	of == bound_end
+
+	* gmime-stream.c (g_mime_stream_eos): Do some simple bounds
+	checking.
+
+	* doc/*: Updated.
+
+	* gmime-part.c (g_mime_part_get_content_object): Added.
+
+2001-09-19  Jeffrey Stedfast  
+
+	* gmime-stream-fs.c (stream_seek): Improve.
+
+	* gmime-stream-file.c (stream_reset): Oops, reset the position
+	pointer on a successful reset.
+	(stream_seek): Fixed.
+
+2001-09-19  Jeffrey Stedfast  
+
+	* gmime-stream-fs.c (stream_reset): Reset the position offset. Doh!
+
+	* gmime-stream.c (g_mime_stream_write_to_stream): Don't increment
+	total if no bytes were read/written.
+
+	* gmime-stream-filter.c (stream_substream): Copy over the filters.
+
+	* gmime-part.c (g_mime_part_verify_content_md5): Updated.
+	(g_mime_part_set_content_md5): Updated.
+	(g_mime_part_get_content): Updated.
+	(write_content): Updated.
+
+	* gmime-data-wrapper.c (g_mime_data_wrapper_write_to_stream):
+	Implemented.
+
+	* gmime-filter-basic.[c,h]: A basic filter that does Base64 and QP
+	encoding/decoding.
+
+	* gmime-filter-crlf.[c,h]: A simple filter that does crlf(/dot)
+	encoding/decoding.
+
+2001-09-19  Jeffrey Stedfast  
+
+	* gmime-data-wrapper.c (g_mime_data_wrapper_new_with_stream): Ref
+	the stream.
+	(g_mime_data_wrapper_set_stream): Same.
+	(g_mime_data_wrapper_get_stream): Return the internal stream.
+	(g_mime_data_wrapper_get_encoding): Return the internal stream's
+	encoding.
+	(g_mime_data_wrapper_write_to_stream): Not-yet-implemented.
+
+	* gmime-filter.[c,h]: Abstract class for filters.
+
+	* gmime-stream-filter.[c,h]: Abstract stream for filtering.
+
+	* gmime-part.c (g_mime_part_set_content): Updated for data-wrapper
+	changes.
+	(g_mime_part_set_content_byte_array): Same.
+	(g_mime_part_set_pre_encoded_content): And here.
+	(g_mime_part_get_content): And here too.
+
+	* gmime-parser.c (g_mime_parser_construct_part_internal): Fix
+	offset calculations.
+	(g_mime_parser_construct_part_internal): Updated for data-wrapper
+	changes.
+
+2001-09-18  Jeffrey Stedfast  
+
+	* test-parser.c (test_parser): Updated.
+
+	* test-mime.c (test_parser): Updated.
+
+	* gmime-utils.h: Move the GMimePartEncodingType enum here.
+
+	* gmime-stream-fs.[c,h]: Implemented.
+
+	* gmime-stream.c (g_mime_stream_construct): New function to
+	initialize the stream data members.
+	(g_mime_stream_substream): New function to get a substream of
+	another stream.
+	(g_mime_stream_unref): If the stream is actually a substream,
+	unref it's "super" stream if we are destroying the substream.
+
+	* gmime-stream-mem.c (stream_substream): Implemented.
+	(g_mime_stream_mem_new): Updated to use g_mime_stream_construct().
+	(g_mime_stream_mem_new_with_byte_array): Same.
+	(g_mime_stream_mem_new_with_buffer): And here too.
+
+	* gmime-stream-file.c (stream_substream): Implemented.
+	(g_mime_stream_file_new): Updated to use
+	g_mime_stream_construct().
+	(g_mime_stream_file_new_with_bounds): Same.
+
+	* gmime-part.c (g_mime_part_set_content_md5): Updated to use
+	streams.
+	(g_mime_part_verify_content_md5): Same.
+	(g_mime_part_set_content): Updated to use streams and data
+	wrappers.
+	(g_mime_part_set_content_byte_array): Same.
+	(g_mime_part_set_pre_encoded_content): And here.
+	(g_mime_part_set_content_object): New function that allows one to
+	set the content object of a MIME part.
+	(g_mime_part_get_content): Updated to use streams.
+	(write_content): Same.
+	(g_mime_part_write_to_stream): Replacement for
+	g_mime_part_write_to_string().
+	(g_mime_part_to_string): Updated to use
+	g_mime_part_write_to_stream().
+	(g_mime_part_destroy): Updated to destroy the content object
+	rather than destroying a GByteArray (since we longer use a
+	GByteArray for the content data).
+
+	* gmime-parser.c (g_mime_parser_construct_message): Now takes a
+	stream argument instead of a string.
+	(g_mime_parser_construct_message_from_file): Deprecated.
+	(g_mime_parser_construct_part): Also takes a stream now.
+
+	* gmime-message.c (g_mime_message_write_to_stream): Replacement
+	for g_mime_message_write_to_string().
+	(g_mime_message_to_string): Updated.
+
+	* gmime-header.c (g_mime_header_write_to_stream): Replacement for
+	g_mime_header_write_to_string().
+	(g_mime_header_to_string): Updated.
+
+2001-09-17  Jeffrey Stedfast  
+
+	* gmime-stream.[c,h]: Abstract stream class.
+
+	* gmime-stream-mem.[c,h]: Memory stream.
+
+	* gmime-stream-file.[c,h]: File stream.
+
+	* gmime-data-wrapper.[c,h]: Data wrapper class. Will be used as
+	the content object in MIME parts.
+
+2001-08-23  Jeffrey Stedfast  
+
+	* gmime-utils.c (encode_8bit_word): Oops. Add the closing ? char.
+	(g_mime_utils_8bit_header_encode): Oops. Make sure we encode *all*
+	lwsp chars.
+	(g_mime_utils_8bit_header_decode): Slightly better fix for the
+	other day.
+
+2001-08-19  Jeffrey Stedfast  
+
+	* doc/*: Updated.
+
+2001-08-18  Jeffrey Stedfast  
+
+	* Makefile.am: Added gmime-charset.[c,h] to the build.
+
+	* gmime-charset.[c,h]: New source files for managing charset
+	related issues.
+	(g_mime_charset_init): New function to retrieve the user's locale
+	information for later use with gmime_charset_locale_name.
+	(g_mime_charset_locale_name): New function to return user's
+	locale.
+
+	* gmime-utils.c (g_mime_utils_8bit_header_decode): linear
+	whitespace isn't the only thing that can delimit atoms.
+	(get_codeset): Removed in favor of the new gmime-charset
+	functions.
+	(g_mime_utils_8bit_header_encode): Use g_mime_charset_locale_name.
+	(encode_8bit_word): And here too.
+
+2001-08-15  Jeffrey Stedfast  
+
+	* internet-address.c (decode_mailbox): When returning due to a
+	missing local part, make sure to set *in to inptr.
+
+2001-08-13  Charles Kerr 
+
+	* gmime-utils.c (encode_8bit_word): query nl_langinfo for the
+	codeset instead of just assuming iso-8859-1.  Thanks to Volodymyr
+	M . Lisivka  for suggesting this patch.
+
+	* gmime-utils.c (g_mime_utils_8bit_header_encode): same.
+
+	* gmime-parser.c (find_header_part_end): new utility function to
+	find the dividing line between body & header.
+	(g_mime_parser_construct_part): sync.
+	(g_mime_parser_construct_message): sync.
+
+	* gmime-parser.c (get_header_block): remove unused func.
+	(rfc822_headers): remove unused static array.
+
+2001-07-02  Jeffrey Stedfast  
+
+	* zentimer.h: Added. Provides some timing macros for performace
+	testing.
+
+	* zenprofiler.h: Added. Extends zentimer.h as a simple profiler
+	that gives nice printouts.
+
+	* test-parser.c: Use zentimer.h
+
+2001-06-23  Jeffrey Stedfast  
+
+	* gmime-header.c (g_mime_header_remove): New function.
+	(g_mime_header_set): Setting header to NULL no longer removes the
+	header. Use g_mime_header_remove instead.
+
+	* gmime-message.c (g_mime_message_write_to_string): No longer have
+	to sync the headers.
+	(g_mime_message_get_headers): Same.
+	(g_mime_message_set_sender): sync the From header.
+	(g_mime_message_set_reply_to): Sync the Reply-To header.
+	(g_mime_message_add_recipient): Sync the recipient header.
+	(g_mime_message_add_recipients_from_string): Same.
+	(g_mime_message_set_subject): Sync the Subject header.
+	(g_mime_message_set_date): Sync the date header.
+	(g_mime_message_set_message_id): Sync the Message-Id header.
+
+2001-06-03  Jeffrey Stedfast  
+
+	* gmime-utils.c (quoted_encode): Minor cleanup.
+
+2001-06-02  Jeffrey Stedfast  
+
+	* gmime-message.c (sync_headers): Oops. Don't place "Cc:" in the
+	header value string :-)
+
+2001-03-31  Charles Kerr 
+
+	* gmime-utils.c (g_mime_utils_8bit_header_decode): big speedups.
+
+	* gmime-utils.c (g_mime_utils_8bit_header_encode): small speedups.
+
+2001-05-29  Jeffrey Stedfast  
+
+	* internet-address.c (decode_mailbox): Oops, test to make sure we
+	won't be running past the end of the buffer when considering a
+	retry. Thanks to Charles Kerr for this fix.
+
+2001-03-29  Charles Kerr 
+
+	* gmime-part.c (g_mime_part_append_pre_encoded_content): fix small
+	bug that crept into the last commit.
+
+2001-05-29  Jeffrey Stedfast  
+
+	Fixes on behalf of Charles Kerr of Pan fame:
+	
+	* gmime-parser.c (g_mime_parser_construct_part_from_file):
+	Use g_mime_part_append_pre_encoded_content().
+
+	* gmime-part.c (g_mime_part_append_pre_encoded_content): New
+	function so that the FILE parser doesn't need to manage it's own
+	content array.
+
+	* gmime-header.[c,h]: const'ify.
+	(g_mime_header_foreach): New function to call a chosen function
+	for each header in the header object.
+
+2001-05-26  Jeffrey Stedfast  
+
+	* configure.in: Updated version to 0.6.0.
+
+	* README: Updated version to 0.6.0.
+
+	* doc/*: Updated again.
+
+	* gmime-header.c (g_mime_header_to_string): New function - mostly
+	for the sake of keeping with the API of the rest of GMime.
+	(g_mime_header_set): Make sure to always encode the header value
+	before we set it.
+
+	* gmime-part.c (g_mime_part_write_to_string): New function to
+	write the mime part to a GString.
+	(g_mime_part_to_string): Use g_mime_part_write_to_string.
+
+	* gmime-message.c (g_mime_message_get_headers): Use the new
+	g_mime_header_to_string function.
+	(g_mime_message_write_to_string): New function to write the
+	message to a GString.
+	(g_mime_message_to_string): Use write_to_string.
+
+2001-05-25  Jeffrey Stedfast  
+
+	* doc/*: Updated.
+
+	* Makefile.am: Add gmime-header.[c,h] to the build.
+
+	* gmime-parser.c: Numerous changes to use gmime-header.
+
+	* gmime-message.c: Numerous changes to use gmime-header.
+	(g_mime_message_add_arbitrary_header): Removed.
+	(g_mime_message_set_header): The replacement for
+	add_arbitrary_header.
+	(g_mime_message_get_header): New function to get a header.
+
+	* gmime-header.[c,h]: New source fies to handle the complicated
+	nature of setting/getting header pairs.
+
+2001-05-24  Jeffrey Stedfast  
+
+	* doc/*: Updated.
+
+	* doc/Makefile.am: Use $(INSTALL) and $(INSTALL_DATA) rather than
+	`install -m 644`
+
+	* alloca.c: New file for systems that do not have alloca().
+
+	* Makefile.am: build alloca.c
+
+	* gmime-utils.c: Don't #include  - this is now handled
+	by config.h.
+
+	* config.h.in: Added alloca define checks.
+
+	* acconfig.h: Remove some extra defines that we don't care about.
+
+2001-05-20  Jeffrey Stedfast  
+
+	* gmime-parser.c (parse_content_headers): Simplified and also
+	unfolded content-headers.
+
+	* gmime-part.c (g_mime_part_get_filename): If there isn't a
+	disposition, make sure that we don't ignore the possibility of a
+	"name" param in the Content-Type header.
+
+2001-05-12  Jeffrey Stedfast  
+
+	* gmime-utils.c (need_quotes): Include '.' as a char to quote.
+
+	* gen-table.c (main): Fixed a type-o.
+
+	* internet-address.c (decode_mailbox): Be a little more forgiving
+	about unexpected chars while parsing the name part of the email
+	address. Skip the bad char and then retry. If we fail again,
+	*then* we abort.
+
+	* gmime-utils.c: #include 
+
+	* gmime-parser.c (g_mime_parser_construct_part): Oops, inend
+	points to the end of the string, not the last char of the string
+	(ie, '\0' not the char before it).
+
+2001-05-08  Jeffrey Stedfast  
+
+	* gmime-table-private.h: Oops, take out the check for isblank().
+
+	* internet-address.c (decode_quoted_string): Get rid of unused
+	variable.
+	(decode_address): Same.
+
+2001-04-03  Jeffrey Stedfast  
+
+	* internet-address.c (decode_domain): Try to only get
+	"fully-qualified" domain names, or ones that "look" like they are
+	at least ;-)
+	(decode_mailbox): If decode_domain() returns NULL, don't append
+	the '@' char. Also make sure that the name is non-empty.
+
+2001-04-01  Jeffrey Stedfast  
+
+	* gmime-utils.c (g_mime_utils_quote_string): Made smarter.
+
+2001-03-31  Jeffrey Stedfast  
+
+	* Makefile.am: Added rules to build gen-table.c and added
+	gmime-table-private.h to the build.
+
+	* gen-table.c: New file to generate gmime-table-private.h if need
+	be.
+
+	* gmime-table-private.h: New file that contains
+	gmime_special_table.
+
+	* gmime-utils.c: Remove the gmime_special_table from here and
+	instead #include gmime-table-private.h.
+
+	* internet-address.c: #include gmime-table-private.h
+
+2001-03-30  Jeffrey Stedfast  
+
+	* gmime-message.c (create_header): Simplified a tad.
+	(g_mime_message_add_recipient): Updated for the new
+	InternetAddress API.
+	(g_mime_message_add_recipients_from_string): Simplified greatly
+	using the new InternetAddress API.
+
+	* internet-address.[c,h]: Completely rewritten to be a lot more
+	rfc0822 compliant.
+
+2001-03-28  Jeffrey Stedfast  
+
+	* README, configure.in: Updated version to 0.5.0
+
+2001-03-29  Charles Kerr 
+
+	* gmime-parser.c (g_mime_parser_construct_message_from_file): new
+	function to read a message from a FILE* instead of a character
+	array.  This can be used to reduce the memory requirements of very
+	large messages.
+
+	* gmime-parser.c (get_next_line): new internal function.
+	* gmime-parser.c (g_mime_parser_construct_part_from_file): same.
+	* gmime-parser.c (parse_content_headers): same.
+	* gmime-parser.c (find_header_end): same.
+	* gmime-parser.c (get_header_block): same.
+	* gmime-parser.c (get_header_block_from_file): same.
+
+2001-03-28  Jeffrey Stedfast  
+
+	* gmime-utils.c (get_time): Fix a compile warning.
+
+2001-03-20  Charles Kerr 
+
+	* gmime-utils.c (get_year): constify the argument list.
+	* gmime-utils.c (get_time): same.
+
+	* gmime-utils.c (get_days_in_month): if #0'ed out unused code.
+	* gmime-utils.c (parse_broken_date): same.
+
+2001-03-15  Jeffrey Stedfast  
+
+	* internet-address.c (internet_address_new_from_string): Try to be
+	a little better about extracting the name, not 100% accurate but
+	better I guess.
+
+2001-03-14  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_get_content_disposition_parameter):
+	It's okay to have a NULL disposition or a NULL param hash.
+	(g_mime_part_get_filename): Same.
+	(g_mime_part_get_content): It's okay not to have content.
+
+2001-03-13  Jeffrey Stedfast  
+
+	* gmime-utils.c (quoted_decode): Fix a possible buffer overrun.
+
+2001-02-27  Jeffrey Stedfast  
+
+	* gmime-utils.c (parse_rfc822_date): Allow for time token to not
+	have a seconds field.
+
+2001-02-11  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_to_string): Oops. Don't init
+	content_md5 with the content location string ;-)
+
+	* gmime-parser.c (g_mime_parser_construct_part): Init content to
+	NULL to get rid of a warning (this doesn't really matter as 'len'
+	was init'd to 0)
+
+	* gmime-part.c: #include unistd.h
+
+2001-01-27  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_set_content_byte_array): So
+	set_content_array() was no good. After inspecting glib it was
+	discovered that there are hidden data members of a GByteArray that
+	hold info like if the data is NUL terminated, how much data is
+	allocated, etc.
+
+2001-01-26  Charles Kerr 
+
+	* gmime-part.c (g_mime_part_set_content_array): new function.
+
+2001-01-25  Charles Kerr 
+
+	* gmime-part.c (g_mime_part_destroy): fix memory leak - the
+	disposition wasn't being g_free()d.
+
+2001-01-24  Charles Kerr 
+
+	* gmime-part.c (g_mime_part_get_filename): Now takes a const
+	GMimePart.
+
+2001-01-17  Jeffrey Stedfast  
+
+	* internet-address.c (encoded_name): Updated.
+
+	* gmime-part.c (g_mime_part_set_pre_encoded_content): Updated to
+	reflect changes to gmime-utils.
+
+	* gmime-utils.c (g_mime_utils_text_is_8bit): Take a len argument.
+	(g_mime_utils_best_encoding): Same.
+	(encode_8bit_word): Updated.
+
+2001-01-14  Jeffrey Stedfast  
+
+	* gmime-parser.c (g_mime_parser_construct_part): Check for NULL
+	returns from g_strstrbound.
+
+2001-01-11  Charles Kerr 
+
+	* gmime-utils.c (get_year): small patch to handle 2-digit year
+	representation a little better -- "71" now translates to 1971,
+	but "01" now translates to 2001.  Thanks to Ihar Viarheichyk for
+	suggesting this change.
+
+2001-01-07  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_set_content_md5): Don't allow the
+	setting of Content-MD5 headers for multipart/* and message/rfc822
+	types.
+
+	* rfc/rfc1864.txt: Added (Content-MD5 RFC).
+
+2001-01-05  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_set_content_md5): Oops, didn't quite
+	do this right. It should be correct now.
+	(g_mime_part_verify_content_md5): New function to verify the
+	Content-MD5.
+
+2001-01-04  Jeffrey Stedfast  
+
+	* gmime-parser.c (g_mime_parser_construct_part): Added support for
+	parsing Content-Location and Content-Md5 headers. Trim excess
+	trailing \n's. Also fix a bug where the end boundary would get
+	included as part of the last MIME Part's contents.
+	(g_strstrbound): Bounded strstr.
+
+	* configure.in:
+	* README: Updated version to 0.4.0
+
+	* Makefile.am: Added md5-utils to the build.
+
+	* md5-utils.[c,h]: Added.
+
+	* gmime-part.c (g_mime_part_to_string): Slightly new
+	implementation. Also added in support for Content-Location and
+	Content-Md5 headers.
+	(g_mime_part_destroy): Return if the mime part is
+	NULL. Also free the new content_location and content_md5 headers.
+	(g_mime_part_set_content_md5): Implemented.
+	(g_mime_part_get_content_md5): Implemented.
+	(g_mime_part_set_content_location): Implemented.
+	(g_mime_part_get_content_location): Implemented.
+	(get_content_type): Append a '\n'.
+
+2001-01-01  Jeffrey Stedfast  
+
+	* doc/gmime-sections.txt: Updated.
+
+	* doc/sgml/*: Updated.
+
+	* doc/html/*: Updated.
+
+2000-12-24  Jeffrey Stedfast  
+
+	* gmime-parser.c (g_mime_parser_construct_part): Don't set the
+	boundary if we are able to get the boundary from the content-type
+	because we'll just set the same data over again which is a
+	waste. Also tack a \n onto the ends of the boundary markers so
+	that "blah_" and "blah_D" don't trick the parser. Fix it so that
+	an empty part won't set any contents (since setting a 0-length
+	content stream causes a segfault).
+	(construct_headers): Take an inlen argument so that we can parse
+	headers without needing to strdup before passing into this
+	function.
+	(g_mime_parser_construct_message): Don't strdup the headers since
+	we can just pass in the length to the construct_headers() function
+	now.
+
+2000-12-18  Jeffrey Stedfast  
+
+	* gmime-parser.c (g_mime_parser_construct_part): Moved from being
+	an internal-only function.
+
+2000-12-28  Charles Kerr 
+
+	* gmime-utils.c (g_mime_utils_text_is_8bit): gracefully handle
+	a NULL pointer being passed in.  Thanks to Christophe Lambin for
+	reporting this problem.
+
+2000-12-14  Charles Kerr 
+
+	* gmime-messge.c (g_mime_message_get_message_id):  change
+	g_return_if_fail() to g_return_val_if_fail() to ensure that
+	a value is always returned.
+
+	* gmime-part.h (g_mime_part_get_content_description): make
+	the GMimePart argument const.
+	* gmime-part.h (g_mime_part_get_content): same.
+
+	* test-mime.c (test_addresses): fix bad printf statement.
+
+	* test-parser.c (test_parser): fixed the printf type of a time_t
+	from an int to unsigned long to avoid compiler warnings.
+
+2000-12-13  Jeffrey Stedfast  
+
+	* doc/sgml/*:
+	* doc/html/*:
+	* doc/gmime-sections.txt: Updated.
+
+	* README: Updated version line to 0.3.0
+
+2000-12-12  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_to_string): Wrap some content-*
+	headers that might sometimes be long.
+
+	* gmime-message.c (create_header): Updated to reflect function
+	name changes/moves.
+
+	* gmime-utils.c (g_mime_utils_header_printf): Moved here from
+	gmime-message.c and slightly renamed ;-)
+	(g_mime_utils_header_fold): Moved from being private to being
+	public.
+
+2000-12-12  Jeffrey Stedfast  
+
+	* gmime-part.c: Hmmm, why weren't multiparts using the internal
+	get_content_type function rather than ...content_type_to_string?
+	Possible FIXME: Should content_type_to_string do what
+	get_content_type does? or should it remain untouched and just
+	return "type/subtype"?
+
+	* gmime-part.h: No more boundary data member.
+
+	* gmime-part.c (g_mime_part_get_boundary): Updated, as we no
+	longer store the boundary on the MIME Part and instead only on the
+	content-type (where it belongs).
+	(g_mime_part_set_boundary): And here too.
+	(g_mime_part_destroy): No longer need to destroy the boundary.
+
+2000-12-11  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_get_subpart_from_content_id): Erm,
+	smack me. This needs to be recursive (this is what happens when I
+	code really late at night).
+
+2000-12-11  Jeffrey Stedfast  
+
+	* configure.in (GMIME_MINOR_VERSION): Updated to 0.3.0
+
+	* gmime-parser.c (get_mime_part): Updated to reflect the
+	add_subpart API change.
+
+	* test-mime.c (test_multipart): And here too.
+
+	* gmime-part.h (g_mime_part_add_child): Macro added for backward
+	source compatability.
+
+	* gmime-part.c (g_mime_part_get_subpart_from_content_id): Renamed
+	from g_mime_part_get_child_from_content_id as I think I'm gonna
+	start calling them subparts in the API as it's a bit clearer than
+	calling them children. Also fixed up some of the logic (what if
+	the parent mime part had a content-id? The way the code was before
+	it'd never search the subparts). Oh, it also returns const now.
+	(g_mime_part_add_subpart): Renamed from g_mime_part_add_child and
+	also now does some error checking to make sure the parent part is
+	a multipart.
+
+2000-12-10  Charles Kerr 
+
+	* gmime-part.c (g_mime_part_get_child_by_content_id): new
+	utility function.
+
+2000-12-09  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_set_boundary): Generate a random
+	boundary if passed boundary is NULL.
+
+2000-12-07  Jeffrey Stedfast  
+
+	* gmime-message.c (multipart_get_body): Traverses a MIME Part and
+	'always' extracts the body assuming it exists. Extracts the
+	preffered text type if it exists, otherwise returns the type less
+	preferred.
+	(g_mime_message_get_body): Use multipart_get_body if the toplevel
+	part is a multipart.
+
+2000-12-05  Jeffrey Stedfast  
+
+	* README: Updated with more RFCs, etc.
+
+	* rfc/* Added a bunch more rfcs of interest.
+
+2000-12-04  Jeffrey Stedfast  
+
+	* test-mime.c: Added test code for the address parser.
+
+	* gmime-utils.c (g_mime_utils_quoted_encode_step): Updated. No
+	longer need to special-case whitespace chars as they have been put
+	into the gmime_special_table (a while ago).
+
+2000-12-02  Jeffrey Stedfast  
+
+	* Makefile.am: Install gmime.m4
+
+	* gmime.m4: Added.
+
+2000-12-02  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_foreach): New convenience function for
+	manipulating each subpart of a mime part.
+
+	* gmime-message.c (g_mime_message_foreach_part): New convenience
+	function for manipulating all mime parts of a message.
+
+2000-12-02  Jeffrey Stedfast  
+
+	* doc/sgml/*:
+	* doc/html/*: Updated.
+
+	* doc/gmime-sections.txt: Add g_mime_message_[g,s]et_message_id.
+
+	* gmime-parser.c (construct_headers): Parse out Message-Id
+	headers.
+
+	* gmime-message.c (g_mime_message_destroy): Free the message id.
+	(g_mime_message_set_message_id): New function to set the message
+	id on a message.
+	(g_mime_message_set_message_id): New accessor function for
+	message-ids.
+	(create_header): Write out the Message-Id if and only if it
+	exists.
+
+2000-11-29  Jeffrey Stedfast  
+
+	* README: Updated.
+
+	* doc/gmime-sections.txt: Added new functions.
+
+	* doc/html/*: Updated.
+
+2000-11-29  Jeffrey Stedfast  
+
+	* configure.in: Bumped the version to 0.2.0 because the API has
+	changed a bit.
+
+	* test-parser.c:
+	* test-mime.c: Updated.
+
+	* gmime-utils.c (BASE64_ENCODE_LEN):
+	(QP_ENCODE_LEN): Macros for determining how much space we need to
+	encode a chunk of data to that encoding (estimate is liberal).
+	(encode_8bit_word): Use the macros to determine the length we
+	need.
+
+	* gmime-message.c (g_mime_message_get_body): Updated to reflect
+	changes to gmime-part.
+
+	* gmime-parser.c (get_mime_part): Updated.
+
+	* gmime-part.c (g_mime_part_set_content): Now takes a len argument
+	and has been updated to reflect the move to GByteArray.
+	(g_mime_part_destroy): Updated.
+	(g_mime_part_set_pre_encoded_content): New convenience function to
+	decode pre-encoded content and set it on the mime part.
+	(g_mime_part_get_content): Renamed from
+	g_mime_part_decode_contents.
+
+	* gmime-part.h: GMimePart->content is now a GByteArray that will
+	hold the raw content (in it's unencoded form).
+
+2000-11-28  Jeffrey Stedfast  
+
+	* gmime-content-type.c (g_mime_content_type_new_from_string):
+	Ignore extranious semicolons between parameters. Handle the event
+	where the content-type doesn't specify a subtype (this is broken
+	but some mailers will send "Content-Type: text" for example).
+	(g_mime_content_type_new): If there isn't a type or subtype, print
+	a warning and try to do some smart defaulting action.
+
+	* gmime-message.c (handle_multipart_alternative): Only remember
+	the last subpart if it was a text part.
+
+2000-11-19  Jeffrey Stedfast  
+
+	* doc/html/*:
+	* doc/sgml/*: Updated.
+
+	* test-mime.c: Updated.
+
+	* gmime-utils.c (g_mime_utils_quote_string): Do the detection on
+	whether or not to wrap the string in quotes here rather than
+	requiring a boolean argument specifying whether the string should
+	be quoted. RFC2045 provides us with a list of characters that are
+	not safe.
+
+	* gmime-param.c (g_mime_param_to_string): Updated to reflect
+	changes to g_mime_utils_quote_string. This function is the main
+	reason for the change - parameter values should really only be
+	quoted if they have to be else they should remain unquoted.
+
+	* internet-address.c (encoded_name): Updated to reflect changes to
+	g_mime_utils_quote_string.
+
+2000-11-19  Jeffrey Stedfast  
+
+	* TODO: Updated.
+
+	* gmime-utils.c: Updated gmime_special_table.
+	(g_mime_utils_8bit_header_encode): Since rfc2047 states that all
+	whitespace between encoded atoms must be ignored, the encoder
+	should therefor make an effort to encode whitespace when it falls
+	between two atoms that will be encoded. Use the IS_ESAFE mask.
+	(quoted_encode): Now takes a safemask argument to specify which
+	chars are safe to leave unencoded and also a arg to save whether
+	or not the word was encoded.
+	(g_mime_utils_8bit_header_encode_phrase): Updated to use the
+	IS_PSAFE mask.
+
+2000-11-19  Jeffrey Stedfast  
+
+	* gmime-parser.c (header_unfold): New function to unfold a header
+	(to be used internally).
+	(construct_headers): Unfold headers as we parse them.
+
+	* configure.in: Changed version to 0.1.1.
+
+	* gmime-part.c (get_content_disposition): Append a ";" before
+	appending any parameters even when there is no disposition
+	text. Also only enter into the param loop if there exist params.
+
+2000-11-16  Jeffrey Stedfast  
+
+	* doc/sgml/*: Added.
+	
+	* doc/gmime-sections.txt: Added g_mime_part_decode_contents and
+	g_mime_header_printf.
+
+	* gmime-message.c (header_fold): New function to fold headers.
+	(g_mime_header_printf): New convenience function to print a
+	formatted header (which will get correctly folded).
+	(create_header): Correctly fold each header.
+
+2000-11-16  Charles Kerr 
+
+	* gmime-utils.c (datetok): don't crash if the date string passed
+	in is NULL.
+
+2000-11-15  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_decode_contents): New convenience
+	function to decode the contents of a mime part (based on code by
+	Wayne Schuller).
+
+2000-11-14  Jeffrey Stedfast  
+
+	* doc/html/index.sgml: Added - apparently we need this :-)
+
+	* doc/Makefile.am: Updated to pass distcheck
+
+2000-11-10  Jeffrey Stedfast  
+
+	* doc/gmime-docs.sgml: Added a new paragraph explaining the
+	difference between functions that return const and the ones that
+	don't.
+	
+	* doc/html/*.html: Updated.
+
+	* gmime-message.c: 
+	* gmime-part.c: 
+	* gmime-parser.c: 
+	* internet-address.c: 
+	* gmime-param.c: Updated Gtk-Doc comments.
+
+	* gmime-content-type.c: Wrote Gtk-Doc comments.
+
+2000-11-10  Jeffrey Stedfast  
+	
+	* Makefile.am (SUBDIRS): Added doc
+
+	* configure.in: Generate doc/Makefile
+
+	* doc/Makefile.am: Ignore more headers when performaing
+	gtkdoc-scan.
+
+	* doc/gmime-docs.sgml:
+	* doc/gmime-sections.txt: Added.
+
+	* doc/html/*.html: Generated library reference.
+
+2000-11-09  Jeffrey Stedfast  
+
+	* TODO: Updated.
+
+	* test-mime.c: Added test of the new quote/unquote functions.
+	
+	* gmime-message.c (g_mime_message_add_recipients_from_string):
+	Check for escaped quotes.
+	
+	* gmime-part.c (get_content_type): Correctly quote params.
+	(get_content_disposition): Same.
+
+	* gmime-param.c (g_mime_param_new_from_string): Check for escaped
+	quotes. Also use unquote_string() to unquote the value.
+	(g_mime_param_to_string): Correctly quote the value.
+
+	* gmime-parser.c (get_mime_part): Check for escaped quotes and
+	correctly unquote strings where appropriate.
+
+	* gmime-utils.c (g_mime_utils_quote_string): New convenience
+	function to escape and quote a string.
+	(g_mime_utils_unquote_string): New convenience function to
+	un-escape and un-quote a string.
+
+	* internet-address.c (encoded_name): Use quote_string().
+	(internet_address_new): Use unquote_string() to unquote and
+	unescape the name component (it will be re-escaped and re-quoted
+	when it's written to a string later).
+
+2000-11-09  Jeffrey Stedfast  
+
+	* TODO: Updated.
+
+2000-11-08  Jeffrey Stedfast  
+
+	* gmime-parser.c (construct_headers): Oops. Set the subject with
+	the decoded string rather than the encoded one.
+	(get_mime_part): On the chance that we come accross a broken
+	multipart, default the mime type to text/plain and continue on.
+
+2000-11-08  Jeffrey Stedfast  
+
+	* internet-address.c (internet_address_to_string): Moved code
+	around to avoid unecessary warnings.
+
+	* gmime-utils.c: Added Gtk-Doc style comments to all the
+	functions.
+	(g_mime_utils_best_encoding): Return a GMimePartEncodingType
+	instead of gint.
+
+2000-11-01  Jeffrey Stedfast  
+
+	* Makefile.am (INCLUDES): Add -DG_LOG_DOMAIN=\"gmime\"
+
+2000-10-31  Jeffrey Stedfast  
+
+	* test-parser.c (test_parser): Test g_mime_message_get_body() here
+	as well.
+
+	* test-mime.c: Updated to reflect changes to get_body.
+	
+	* gmime-message.c (g_mime_message_get_body): Return an allocated
+	buffer because we want to return the decoded message body rather
+	than the (possibly) encoded form.
+	(create_header): Write out the arbitrary headers first as they may
+	contain headers like "Received:" which really ought to be at the
+	top.
+
+	* gmime-part.c: Removed some old cruft.
+
+2000-10-29  Jeffrey Stedfast  
+
+	* internet-address.c (encoded_name): Use
+	g_mime_utils_8bit_header_encode_phrase() to encode the addrspec.
+
+	* gmime-utils.c (g_mime_utils_8bit_header_decode): Fix to make the
+	decoder more rfc compliant. As stated by rfc2047, all white space
+	between encoded words MUST be ignored.
+	(g_mime_utils_8bit_header_encode_phrase): New rfc2047 encoding
+	function for phrases (see rfc2047 section 5 part 3).
+
+2000-10-28  Jeffrey Stedfast  
+
+	* gmime-utils.c (parse_rfc822_date): Fixed the off-by-one-hour
+	bug.
+
+	* test-mime.c: Updated to reflect changes to
+	g_mime_message_get_body().
+
+	* gmime-message.c (g_mime_message_get_headers): Added Gtk-Doc
+	comment.
+	(g_mime_message_get_body): Modified to return a const pointer to
+	the message body rather than allocating it.
+
+2000-10-28  Charles Kerr 
+
+	* gmime-message.c (g_mime_message_get_headers): New function
+	similar to g_mime_message_get_body.  Useful if you want a raw
+	display of headers separate from the body.
+
+	* gmime-message.[c,h] (g_mime_message_get_body): made const.
+
+2000-10-28  Jeffrey Stedfast  
+
+	* tests/Makefile.am: New automake file (when we make a release,
+	this directory should really be a part of the tarball as it
+	contains data for the test programs).
+
+	* tests/.cvsignore: Added.
+
+	* Makefile.am (SUBDIRS): Add the 'tests' directory
+
+	* configure.in: Generate tests/Makefile
+
+2000-10-27  Jeffrey Stedfast  
+
+	* test-mime.c: Added code to test g_mime_message_get_body()
+
+	* gmime-message.c (g_mime_message_get_body): New convenience
+	function that attempts to get the message body in the requested
+	text format (plain vs html).
+
+	* gmime-parser.c (construct_headers): If the end of a header field
+	is the end of the header, break out of the loop.
+
+	* gmime-content-type.[c,h]: Added const to arguments where
+	appropriate.
+
+	* gmime-utils.h: Fixed a spelling mistake in a comment ;-)
+
+2000-10-26  Charles Kerr 
+
+	* gmime-utils.h: made const the input ptrs for encode/decode
+	funcs.
+
+	* gmime-utils.c: Updated to reflect const changes.
+
+2000-10-26  Jeffrey Stedfast  
+
+	* test-mime.c: Also updated.
+
+	* gmime-parser.c (construct_headers): Updated to reflect name
+	changes.
+
+	* gmime-message.c: Updated to reflect name changes.
+
+	* gmime-message.h: Changed the name of the recipient type
+	#defines.
+
+2000-10-24  Jeffrey Stedfast 
+
+	* Makefile.am (SUBDIRS): Added "."
+
+	* configure.in: Create libgmime.spec
+
+2000-10-24  Charles Kerr 
+
+	* gmime-utils.c: added #include  to pick up atoi.
+
+	* internet-address.c (internet_address_new): removed unused
+	variable `decoded'
+
+2000-10-24  Jeffrey Stedfast  
+
+	Thanks to Charles Kerr of Pan fame for the following fixes.
+
+	* gmime-utils.c (encode_8bit_word): Oops, encode 'word' and not 'ptr'.
+
+	* gmime-part.c (g_mime_part_destroy): Free the content-id.
+
+2000-10-21  Jeffrey Stedfast  
+
+	* gmime.h.in: Wrap definitions in #ifndef __GMIME_H__
+
+2000-10-18  Jeffrey Stedfast  
+
+	* TODO: Updated.
+
+	* test-*.c: Updated to reflect GMime API changes.
+
+	* gmime-part.c: #include "gmime-utils.h"
+
+	* gmime-parser.c (g_mime_parser_construct_message): Now takes a
+	boolean argument 'save_extra_headers' which tells the parser
+	whether it should add unknown headers to the arbitrary header
+	array or ignore them.
+	(construct_headers): Save the extra headers if desired.
+
+	* gmime-message.c (g_mime_message_add_arbitrary_header): Use the
+	new GMimeHeader structure.
+	(g_mime_message_new): Always initialize the arbitrary header array.
+	(g_mime_message_destroy): The arbitrary header array will never
+	be NULL (as it is now pre-initialized) so don't bother
+	checking.
+	(create_header): rfc2047 encode the arbitrary header values.
+
+2000-10-17  Jeffrey Stedfast  
+
+	* rfc/rfc*.txt: MIME specification RFCs
+
+	* README: Updated.
+
+	* TODO: Added a list of tasks that need to be done eventually.
+
+	* gmime-parser.c (get_mime_part): rfc2047 decode the
+	content-description before we set the value.
+
+	* gmime-part.c (g_mime_part_to_string): rfc2047 encode the
+	content-description before we write it to the string.
+
+2000-10-06  Jeffrey Stedfast  
+
+	* gmime-parser.c (construct_headers): rfc2047 decode some headers.
+
+	* internet-address.c (internet_address_to_string): Now takes an
+	argument to rfc2047 encode or not, when not rfc2047 encoding.
+	(internet_address_new_from_string): Rewrote
+
+	* gmime-message.c (create_header): rfc2047 encode addresses and
+	subject headers.
+
+2000-10-05  Jeffrey Stedfast  
+
+	* gmime-utils.c (g_mime_utils_quoted_encode_step): Fixed some
+	non-compliance issues like encoding all spaces as =20 even when
+	they shouldn't have been.
+
+2000-10-04  Jeffrey Stedfast  
+
+	* acconfig.h:
+	* config.h.in: #undef HAVE_ISBLANK
+
+	* configure.in: Check for the isblank() GNU extension function.
+	
+	* gmime-parser.c (get_mime_part): Parse for the Content-Id. Use
+	isblank() instead of isspace() when looking to see if the content
+	header was wrapped. We want it to match only if the next char is
+	either a tab or a space.
+	(isblank): Define an isblank() macro if HAVE_ISBLANK isn't
+	defined.
+
+	* gmime-part.c (g_mime_part_set_content_id): New function to set
+	the Content-ID.
+	(g_mime_part_get_content_id): New function to get the Content-Id.
+	(g_mime_part_to_string): Print content id's if available.
+	(get_content_type): Eek! If there aren't any params, don't assign
+	'string' an empty string! It's already been initialized with a
+	type!
+
+2000-10-04  Jeffrey Stedfast  
+
+	* gmime-utils.c (quoted_decode): New function to decode rfc2047's
+	version of the quoted-printable encoding.
+	(decode_8bit_word): Use quoted_decode()
+	(quoted_encode): New function to encode to rfc2047's version of
+	quoted-printable (removed from the internals of encode_8bit_word)
+	(encode_8bit_word): Use quoted_encode()
+
+2000-10-01  Jeffrey Stedfast  
+
+	* internet-address.c (internet_address_new_from_string): Fixed a
+	logic error that cut off the last char of the name (or address).
+
+	* gmime-parser.c (construct_headers): Optimized.
+
+	* gmime-part.c (get_content_type): If there are no params, don't
+	try to get any. Fixes a segfault.
+
+	* gmime-utils.[c,h]: New utilities functions for use with libgmime
+	(time and encoding/decoding routines)
+	
+	* test-mime.c: test some of the routines in gmime-utils.c
+
+	* gmime.h.in: #include "gmime-utils.h"
+	
+	* configure.in: Added checks for time zone stuff
+
+	* acconfig.h:
+	* config.h.in: Added some #undef's for timezone stuff
+	
+	* Makefile.am: Added gmime-utils.[c,h]
+
+2000-09-24  Jeffrey Stedfast  
+
+	* HACKING: Updated
+
+	* gmime-param.c: Wrote Gtk-docs comments
+
+	* gmime-parser.c: Wrote Gtk-docs comments
+
+	* AUTHORS: Updated
+
+	* autogen.sh: Updated autogen.sh to look for gmime.h.in instead of
+	gmime.h
+
+2000-09-24  Jeffrey Stedfast  
+	
+	* gmime.h: Removed
+
+	* gmime.h.in: Replacement for gmime.h - modified to be dynamically
+	created at build-time.
+
+	* configure.in: Updated to generate gmime.h and also to ignore
+	doc/ until docs are written.
+
+	* Makefile.am: Modified to ignore doc/
+
+	* tests/*: MIME messages that break are likely to break MIME
+	parsers.
+
+2000-09-24  Jeffrey Stedfast  
+
+	* gmime-part.c (get_content_disposition): Put a space between
+	disposition parameters.
+	(get_content_type): New convenience function to dump the content
+	type and it's params to a string (for use internally).
+	(g_mime_part_to_string): Use get_content_type and add print for
+	content-description's.
+
+	* gmime-parser.c (get_mime_part): strip leading/trailing
+	whitespace from the disposition and convert param names to
+	lowercase. Also fixed Content-Transfer-Encoding.
+
+2000-09-23  Jeffrey Stedfast  
+
+	* gmime-part.c (g_mime_part_destroy): Erm, make sure to increment
+	to the next item in the list.
+
+	* gmime-message.c (recipients_destroy): Optimized a bit
+
+	* gmime-content-type.c (g_mime_content_type_new_from_string):
+	Change all parameter names to lowercase, this way we can look them
+	up without having to know which case the original name used (eg
+	boundary).
+
+	* test-mime.c: renamed from mime-test.c
+
+	* test-parser.c: a new test program that allows us to specify a
+	file to get our test email from.
+
+2000-09-22  Jeffrey Stedfast  
+
+	* configure.in: remember glib_cflags and glib_libs so we can dump
+	them into gmime-config later.
+
+	* gmime-config.in: use glib_cflags and glib_libs.
+
+	* gmime.h: add variables for major/minor/micro release
+
+	* Makefile.am: switch to GMIME_ instead of LIBGMIME_ stuff
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..a1e89e1
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,370 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
+Inc.
+
+   Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.  This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+   Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.  Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below.  The lack of an optional feature in a given package is not
+necessarily a bug.  More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+   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, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+   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 you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+   The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.
+
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package, generally using the just-built uninstalled binaries.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.  When installing into a prefix owned by root, it is
+     recommended that the package be configured and built as a regular
+     user, and only the `make install' phase executed with root
+     privileges.
+
+  5. Optionally, type `make installcheck' to repeat any self-tests, but
+     this time using the binaries in their final installed location.
+     This target does not install anything.  Running this target as a
+     regular user, particularly if the prior `make install' required
+     root privileges, verifies that the installation completed
+     correctly.
+
+  6. 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'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  7. Often, you can also type `make uninstall' to remove the installed
+     files again.  In practice, not all packages have tested that
+     uninstallation works correctly, even though it is required by the
+     GNU Coding Standards.
+
+  8. Some packages, particularly those that use Automake, provide `make
+     distcheck', which can by used by developers to test that all other
+     targets like `make install' and `make uninstall' work correctly.
+     This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.  This
+is known as a "VPATH" build.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' 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.  In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+   The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+   The first method involves providing an override variable for each
+affected directory.  For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'.  Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated.  The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the `DESTDIR' variable.  For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names.  The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters.  On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+   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'.
+
+   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.
+
+   Some packages offer the ability to configure how verbose the
+execution of `make' will be.  For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   HP-UX `make' updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as `configure' are involved.  Use GNU `make'
+instead.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+   On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS
+     KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug.  Until the bug is fixed you can use this workaround:
+
+     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..34c56d6
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,43 @@
+## Process this file with automake to produce Makefile.in
+
+ACLOCAL_AMFLAGS = -I m4
+
+SUBDIRS = m4 build util gmime
+
+if ENABLE_MONO
+SUBDIRS += mono
+endif
+
+SUBDIRS += docs
+
+SUBDIRS += tools .
+
+# build documentation when doing distcheck
+DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
+
+DISTCLEANFILES = iconv-detect.h gmime-$(GMIME_API_VERSION).pc config.lt doltcompile doltlibtool
+
+EXTRA_DIST = 				\
+	PORTING				\
+	gmime.pc.in			\
+	gmime.spec.in 			\
+	iconv-detect.c			\
+	zentimer.h 			\
+	gtk-doc.make
+
+BUILD_EXTRA_DIST = 			\
+	gmime.spec
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = gmime-$(GMIME_API_VERSION).pc
+
+$(pkgconfig_DATA): config.status
+
+dist-hook: $(BUILD_EXTRA_DIST)
+	files='$(BUILD_EXTRA_DIST)'; \
+	for f in $$files; do \
+	  if test -f $$f; then d=.; else d=$(srcdir); fi; \
+	  rm -f $(distdir)/$$f && cp $$d/$$f $(distdir) || exit 1; done
+
+gmime-$(GMIME_API_VERSION).pc: gmime.pc
+	-cp gmime.pc gmime-$(GMIME_API_VERSION).pc
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..7b66f49
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,893 @@
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+@ENABLE_MONO_TRUE@am__append_1 = mono
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
+	$(srcdir)/gmime.pc.in $(srcdir)/gmime.spec.in \
+	$(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
+	TODO config.guess config.rpath config.sub depcomp install-sh \
+	ltmain.sh missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = gmime.spec gmime.pc
+CONFIG_CLEAN_VPATH_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
+DATA = $(pkgconfig_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir dist dist-all distcheck
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = m4 build util gmime mono tools .
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+GZIP_ENV = --best
+DIST_ARCHIVES = $(distdir).tar.bz2
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = -I m4
+AMTAR = @AMTAR@
+API_VERSION = @API_VERSION@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DB2HTML = @DB2HTML@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOLT_BASH = @DOLT_BASH@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GACUTIL = @GACUTIL@
+GAPI_CODEGEN = @GAPI_CODEGEN@
+GAPI_FIXUP = @GAPI_FIXUP@
+GAPI_PARSER = @GAPI_PARSER@
+GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@
+GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@
+GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@
+GMIME_API_VERSION = @GMIME_API_VERSION@
+GMIME_BINARY_AGE = @GMIME_BINARY_AGE@
+GMIME_CFLAGS = @GMIME_CFLAGS@
+GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@
+GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@
+GMIME_LIBDIR = @GMIME_LIBDIR@
+GMIME_LIBS = @GMIME_LIBS@
+GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@
+GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@
+GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@
+GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@
+GMIME_VERSION = @GMIME_VERSION@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@
+GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTCOMPILE = @LTCOMPILE@
+LTCXXCOMPILE = @LTCXXCOMPILE@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MV = @MV@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+RM = @RM@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gacdir = @gacdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ms_librarian = @ms_librarian@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = m4 build util gmime $(am__append_1) tools .
+
+# build documentation when doing distcheck
+DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
+DISTCLEANFILES = iconv-detect.h gmime-$(GMIME_API_VERSION).pc config.lt doltcompile doltlibtool
+EXTRA_DIST = \
+	PORTING				\
+	gmime.pc.in			\
+	gmime.spec.in 			\
+	iconv-detect.c			\
+	zentimer.h 			\
+	gtk-doc.make
+
+BUILD_EXTRA_DIST = \
+	gmime.spec
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = gmime-$(GMIME_API_VERSION).pc
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@if test ! -f $@; then rm -f stamp-h1; else :; fi
+	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) 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@ $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+gmime.spec: $(top_builddir)/config.status $(srcdir)/gmime.spec.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+gmime.pc: $(top_builddir)/config.status $(srcdir)/gmime.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+install-pkgconfigDATA: $(pkgconfig_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+	done
+
+uninstall-pkgconfigDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
+
+# 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):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	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; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	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; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$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_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -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 $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__remove_distdir)
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__remove_distdir)
+
+dist-tarZ: distdir
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__remove_distdir)
+
+dist-shar: distdir
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__remove_distdir)
+
+dist dist-all: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(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
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir); chmod a+w $(distdir)
+	mkdir $(distdir)/_build
+	mkdir $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(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 \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+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 in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(pkgconfigdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+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:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+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)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr \
+	distclean-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-pkgconfigDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-pkgconfigDATA
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
+	ctags-recursive install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am am--refresh check check-am clean clean-generic \
+	clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
+	dist-gzip dist-hook dist-lzip dist-lzma dist-shar dist-tarZ \
+	dist-xz dist-zip distcheck distclean distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags distcleancheck \
+	distdir distuninstallcheck dvi dvi-am html html-am info \
+	info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-pkgconfigDATA \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-am uninstall-pkgconfigDATA
+
+
+$(pkgconfig_DATA): config.status
+
+dist-hook: $(BUILD_EXTRA_DIST)
+	files='$(BUILD_EXTRA_DIST)'; \
+	for f in $$files; do \
+	  if test -f $$f; then d=.; else d=$(srcdir); fi; \
+	  rm -f $(distdir)/$$f && cp $$d/$$f $(distdir) || exit 1; done
+
+gmime-$(GMIME_API_VERSION).pc: gmime.pc
+	-cp gmime.pc gmime-$(GMIME_API_VERSION).pc
+
+# 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..e69de29
diff --git a/PORTING b/PORTING
new file mode 100644
index 0000000..102dddb
--- /dev/null
+++ b/PORTING
@@ -0,0 +1,247 @@
+It is my intention to make migrating code using one version of GMime
+to another as easy as I can and so for the most part, I will try not
+to break API/ABI compatability between versions, however this isn't
+always easy to do.
+
+This document is intended to help developers port their application(s)
+from one version of GMime to another. For each new major release, I
+will attempt to list the main things to watch out for when migrating
+to the new release from the prior version.
+
+
+Porting from GMime 2.4 to GMime 2.6
+-----------------------------------
+
+After releasing GMime 2.4, it was discovered that
+g_mime_stream_length() still returned ssize_t which, on 32bit systems,
+meant that the function was useless if the actual stream was larger
+than 2GB (which could happen if GMime was built with large file
+support).
+
+As I fixed this, I also found some API inconsistencies which I felt I
+might as well fix up since I had to break API/ABI compatibility with
+2.4 anyway.
+
+Most notable in GMime 2.6 is the lack of GMimeSession which has been
+dropped in favor of a much simpler callback
+mechanism. GMimeCipherContexts constructors now take a
+password_request callback function rather than forcing you to subclass
+GMimeSession to get this functionality.
+
+Other API changes include:
+
+- GMimeBestEncoding has been renamed to GMimeEncodingConstraint
+
+- GMimeSignatureValidity has been dropped in favor of
+  GMimeSignatureList which is simply a collection of signatures.
+
+- GMimeSigner has been replaced by GMimeSignature and GMimeCertificate
+  which added a number of new fields and accessors making it much more
+  complete.
+
+- GMimeCipherContext has been renamed to GMimeCryptoContext and the
+  method names for this class have also been renamed in a similar
+  fashion.
+
+- g_mime_crypto_context_encrypt() now takes a digest algorithm
+  argument which is used when the 'sign' argument is TRUE.
+
+- g_mime_multipart_encrypted_encrypt() also now takes a digest
+  algorithm argument which it passes along to
+  g_mime_crypto_context_encrypt().
+
+- g_mime_crypto_context_decrypt() now returns a GMimeDecryptResult
+  which contains a list of signatures (if signed), a list of
+  recipients that the stream had been encrypted to, and also the
+  cipher and digest algorithms used.
+
+- g_mime_multipart_encrypted_decrypt() no longer caches the decrypted
+  part and also now takes a GMimeSignatureList** output argument
+  which it sets in place of having to call
+  g_mime_multipart_encrypted_get_signature_validity() afterward.
+
+For convenience, GMime 2.6 source packages include a shell-script to
+aid in porting applications using GMime 2.4 to the 2.6 API. You can
+find this script under the tools/ directory, named
+`gmime-port-2-4-to-2-6.sh'.
+
+
+Porting from GMime 2.2 to GMime 2.4
+-----------------------------------
+
+GMime 2.4 has had a number of API changes since GMime 2.2. To start,
+ALL public APIs that used to use off_t in GMime 2.2 now use gint64 so
+that the API and ABI do not change based on whether or not large file
+support is enabled.
+
+In addition, all of the functions marked as deprecated in 2.0 and 2.2
+were removed (usually they had equivalent functionality in a parent
+class).
+
+Many functions have also been renamed for better clarity and/or
+consistency. For convenience, GMime 2.4 source packages include a
+shell-script to aid in porting applications using GMime 2.2 (should
+work for most GMime 2.0 applications as well) to the 2.4 API. You can
+find this script under the tools/ directory, named
+`gmime-port-2-2-to-2-4.sh'.
+
+This script won't fix everything, but it should help quite a bit.
+
+Beyond that, a few methods have changed in other ways:
+
+- g_mime_cipher_context_sign() still returns int, but if the value
+  isn't -1 (failure), then it will represent a GMimeCipherHash that it
+  used for signing. This is useful, for example, when the requested
+  hash was GMIME_CIPHER_HASH_DEFAULT.
+
+- g_mime_cipher_context_decrypt() now returns a GMimeSignatureValidty
+  on success and NULL on failure. This is needed in case the encrypted
+  stream was also signed.
+
+- g_mime_multipart_encrypted_encrypt() now takes a boolean 'sign'
+  argument to allow the caller to request encrypting and signing in a
+  single pass.
+
+Several structs have also been rewritten to subclass GObject like
+GMimeContentType and GMimeContentDisposition as well as
+InternetAddress and InternetAddressList.
+
+Not only have InternetAddress and InternetAddressList been ported to
+GObject, but they have also undergone other design
+changes. InternetAddress is now a base class for
+InternetAddressMailbox and InternetAddressGroup, meaning that
+InternetAddress no longer contains a union for group/addr fields.
+
+All functions that return a GObject have been changed to not add a ref
+to the object returned, meaning that it is no longer necessary to call
+g_object_unref() on MIME parts returned from functions like
+g_mime_message_get_mime_part() or g_mime_multipart_get_part(). This
+was done to be more consistent with the Gtk+ API.
+
+
+Porting from GMime 2.0 to GMime 2.2
+-----------------------------------
+
+Note: GMime 2.2 is both API and ABI compatible with GMime 2.0 meaning
+that any program written for GMime 2.0 will compile fine with GMime
+2.2 and any program linked against GMime 2.0's libraries will also
+work with GMime 2.2's libraries.
+
+Most of the changes made between 2.0 and 2.2 were internal but there
+are a few API changes you should be aware of (as these interfaces will
+be deprecated in some future version, probably 3.0).
+
+- g_mime_utils_8bit_header_decode() has been split into 2
+functions. We now have g_mime_utils_header_decode_text() and
+g_mime_utils_header_decode_phrase(). header_decode_text() no longer
+requires encoded-words to be rfc822 atoms. header_decode_phrase() is
+still strict in that encoded-words MUST be valid rfc822 atoms.
+
+- g_mime_utils_8bit_header_encode() has been renamed to
+g_mime_utils_header_encode_text() to be more clear as to what type of
+header this is supposed to encode. If you haven't guessed, this
+function is for encoding rfc822 'text' headers (such as Subject).
+
+- g_mime_utils_8bit_header_encode_phrase() has been renamed to
+g_mime_utils_header_encode_phrase() mostly for consistancy with the
+previous 2 changes.
+
+- g_mime_charset_name() has been renamed to
+g_mime_charset_iconv_name() for clarity.
+
+- g_mime_charset_locale_name() has been renamed to
+g_mime_locale_charset(). Hmmm, was this a bad rename?
+
+- g_mime_cipher_context_verify() no longer returns a
+GMimeCipherValidity, instead it returns a GMimeSignatureValidity which
+is far more useful. Never fear, you may still use the
+GMimeCipherValidity APIs for the time being - they work fine given a
+GMimeSignatureValidity structure.
+
+- g_mime_multipart_signed_verify() also now returns a
+GMimeSignatureValidity structure rather than a GMimeCipherValidity
+structure. See changes to g_mime_cipher_context_verify() for details.
+
+
+Porting from GMime 1.0 to GMime 2.0
+-----------------------------------
+
+The major change here is that I've dropped my own base object class
+and have replaced it with GObject from glib-2.0. This should be a
+pleasant change since you (the developer) will now be able to do many
+more things such as setting arbitrary data on all GMime objects. For
+additional information about GObject, please see the GObject Reference
+Manual at http://developer.gnome.org/doc/API/2.0/gobject/
+
+- The first thing you need to know is that any function returning a
+non-const pointer to any object /must/ be unref'd when you are done
+with it. Since all objects in GMime now subclass GObject, you may
+safely use g_object_unref() (GMimeStream's may also be unref'd
+using g_mime_stream_unref(), but either way is fine).
+
+Don't forget that g_mime_part_get_content_object() returns a
+ref-counted GMimeDataWrapper object now, and so you /must/ unref it
+when you have finished using it. You must also remember to unref any
+GMimeDataWrapper object that you /set/ on a GMimePart using
+g_mime_part_set_content_object() as the GMimePart will now ref the
+content object that you set on it.
+
+- GMimeMultipart is a new class which is to be used for all multipart
+MIME parts rather than GMimePart (as in 1.0). There are also some
+subclasses of GMimeMultipart for other things.
+
+- g_mime_part_[g,s]et_boundary() have been removed (see above). You
+must now create a GMimeMultipart object and use
+g_mime_multipart_[g,s]et_boundary().
+
+- g_mime_part_add_subpart() has been replaced with
+g_mime_multipart_add_part().
+
+- g_mime_part_foreach() has been replaced with
+g_mime_multipart_foreach() and/or g_mime_message_foreach_part().
+
+- g_mime_part_get_subpart_from_content_id() has been replaced with
+g_mime_multipart_get_subpart_from_content_id().
+
+- Another new class is GMimeMessagePart which is to be used for all
+MIME parts containing an rfc822 message. All 1.0 GMimePart's
+representing message/rfc822 parts (as well as message/news parts?)
+need to be migrated over to be GMimeMessagePart objects.
+
+- GMimeMessagePartial is another class meant for handling the
+message/partial MIME type. All 1.0 GMimePart's holding data of this
+type should be replaced with GMimeMessagePartial objects.
+
+- g_mime_message_write_to_stream() and g_mime_part_write_to_stream()
+functions have been consolidated into a virtual method. Replace calls
+to these functions with g_mime_object_write_to_stream(). Note: while
+g_mime_part_write_to_stream() and g_mime_message_write_to_stream()
+still exist, it is suggested you migrate to
+g_mime_object_write_to_stream(). Same goes for g_mime_part_to_string()
+and g_mime_message_to_string().
+
+- GMimeMessage's structure has changed a bit. You will not be able to
+do message->header, instead you want to do ((GMimeObject *)
+message)->header.
+
+- g_mime_message_set_message_id() now takes a message_id argument
+without the encapsulating <>'s (it now just takes the addr-spec
+portion of the msg-id).
+
+- GMimeFilterFrom has changed slightly, you will want to replace all
+calls to g_mime_filter_from_new () with g_mime_filter_from_new
+(GMIME_FILTER_FROM_MODE_DEFAULT) (GMIME_FILTER_FROM_MODE_DEFAULT is
+equivalent to (int) 0).
+
+- GMimeParser has had a number of API additions, but
+g_mime_parser_construct_part() and g_mime_parser_construct_message()
+still exist, however they no longer take a GMimeStream
+argument. Instead, they take a GMimeParser object.
+
+
+
+If you find more trouble spots when porting your code from one version
+of GMime to a later version, please feel free to send me additional
+notes to add to this porting document.
+
+					-- fejj@gnome.org
diff --git a/README b/README
new file mode 100644
index 0000000..f42fed5
--- /dev/null
+++ b/README
@@ -0,0 +1,188 @@
+                            GMime, version 2.6.15
+                   by Jeffrey Stedfast 
+
+
+WHAT IS GMIME
+-------------
+
+GMime is a C/C++ library for parsing and creating messages using
+the Multipurpose Internet Mail Extension (MIME) as defined by the
+following RFCs:
+
+ * 0822: Standard for the Format of Arpa Internet Text Messages
+ * 1521: MIME (Multipurpose Internet Mail Extensions) Part One:
+         Mechanisms for Specifying and Describing the Format of 
+         Internet Message Bodies
+ * 1847: Security Multiparts for MIME: Multipart/Signed and 
+         Multipart/Encrypted
+ * 1864: The Content-MD5 Header Field (Obsoletes rfc1544)
+ * 2015: MIME Security with Pretty Good Privacy (PGP)
+ * 2045: Multipurpose Internet Mail Extensions (MIME) Part One:
+         Format of Internet Message Bodies
+ * 2046: Multipurpose Internet Mail Extensions (MIME) Part Two:
+         Media Types
+ * 2047: Multipurpose Internet Mail Extensions (MIME) Part Three:
+         Message Header Extensions for Non-ASCII Text
+ * 2048: Multipurpose Internet Mail Extensions (MIME) Part Four:
+         Registration Procedures
+ * 2049: Multipurpose Internet Mail Extensions (MIME) Part Five:
+         Conformance Criteria and Examples
+ * 2183: Communicating Presentation Information in Internet Messages:
+         The Content-Disposition Header Field
+ * 2184: MIME Parameter Value and Encoded Word Extensions: Character
+         Sets, Languages, and Continuations
+ * 2231: MIME Parameter Value and Encoded Word Extensions: Character
+         Sets, Languages, and Continuations (Obsoletes rfc2184)
+ * 2822: Internet Message Format (Obsoletes rfc822)
+ * 3156: MIME Security with OpenPGP (Updates rfc2015)
+ * 5322: Internet Message Format (Obsoletes rfc2822)
+
+Other RFCs of interest:
+
+ * 1872: The MIME Multipart/Related Content-type
+ * 1927: Suggested Additional MIME Types for Associating Documents
+ * 2111: Content-ID and Message-ID Uniform Resource Locators
+ * 2311: S/MIME Version 2 Message Specification
+ * 2312: S/MIME Version 2 Certificate Handling
+ * 2387: The Multipart/Related Content-Type.
+ * 2424: Content Duration MIME Header Definition
+ * 2630: Cryptographic Message Syntax
+ * 2632: S/MIME Version 3 Certificate Handling
+ * 2633: S/MIME Version 3 Message Specification
+ * 2634: Enhanced Security Services for S/MIME
+ * 3280: Internet X.509 Public Key Infrastructure certificate and 
+         Certificate Revocation List (CRL) Profile
+
+Cryptography related RFCs:
+
+ * 2268: A Description of the RC2(r) Encryption Algorithm
+ * 2313: PKCS #1: RSA Encryption
+ * 2314: PKCS #10: Certification Request Syntax
+ * 2315: PKCS #7: Cryptographic Message Syntax
+ * 2631: Diffie-Hellman Key Agreement Method
+
+
+LICENSE INFORMATION
+-------------------
+
+The GMime library is Copyright (C) 2000-2011 Jeffrey Stedfast.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+HISTORY
+-------
+
+As a developer and user of Electronic Mail clients, I had come to
+realize that the vast majority of E-Mail client (and server) software
+had less-than-satisfactory MIME implementations. More often than not
+these E-Mail clients created broken MIME messages and/or would
+incorrectly try to parse a MIME message thus subtracting from the full
+benefits that MIME was meant to provide. GMime is meant to address
+this issue by following the MIME specification as closely as possible
+while also providing programmers with an extremely easy to use
+high-level application programming interface (API).
+
+
+OBTAINING GMIME
+---------------
+
+Sources to GMime may be obtained from:
+  http://download.gnome.org/pub/GNOME/sources/gmime/
+or
+  ftp://ftp.gnome.org/pub/GNOME/sources/gmime/
+
+Information regarding GMime may be obtained from the Spruce home page:
+  http://spruce.sourceforge.net/gmime/
+
+Experimental versions of GMime may be obtained by following the
+directions at http://developer.gnome.org/tools/svn.html
+
+  git clone git://git.gnome.org/gmime
+
+
+REQUIREMENTS
+------------
+
+For proper compilation and functionality of GMime, the following packages
+are REQUIRED:
+
+  - Glib version >= 2.18.0
+
+    Glib provides a number of portability-enhancing functions and types.
+    Glib is included in most GMime-supported operating system
+    distributions.  Glib sources may be obtained from:
+      ftp://ftp.gtk.org/pub/glib
+
+
+DOCUMENTATION
+-------------
+
+This is the README file for GMime.  Additional documentation related to
+development using GMime has been included within the source release
+of GMime.
+
+  docs/reference/       Contains SGML and HTML versions of the GMime
+                        reference manual
+
+  docs/tutorial/        Contains SGML and HTML versions of the GMime
+                        tutorial
+
+  AUTHORS               List of primary authors (source code developers)
+
+  COPYING               The GNU Lesser General Public License, version 2
+
+  ChangeLog             Log of changes made to the source code
+
+  INSTALL               In-depth installation instructions
+
+  NEWS                  Release notes (Overview of changes)
+
+  TODO                  Description of planned GMime development
+
+  PORTING               Guide for developers porting their application
+                        from an older version of GMime
+
+
+You can find online developer documentation at
+http://library.gnome.org/devel/gmime/stable/
+
+
+MAILING-LIST
+------------
+
+For discussion of GMime development (either of GMime itself or using
+GMime in your own application), you may find the GMime-Devel
+mailing-list helpful. To subscribe, please see
+http://mail.gnome.org/mailman/listinfo/gmime-devel-list
+
+
+BINDINGS
+--------
+
+Other developers have been working to make GMime available to
+programmers in other languages. The current list of known bindings
+are:
+
+- Perl: http://search.cpan.org/dist/MIME-Fast/
+
+- .NET (Mono): Included in this distribution.
+
+
+REPORTING BUGS
+--------------
+
+Bugs may be reported to the GMime development team by submitting a bug
+report for the gmime module at http://bugzilla.gnome.org/
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..a6512b8
--- /dev/null
+++ b/TODO
@@ -0,0 +1,109 @@
+The following is a list of known places for possible improvement to
+the GMime library. This list of tasks in no way indicates priority,
+that is to say that there is no rhyme or reason to the order that the
+tasks are presented in.
+
+
+GMime 2.6 Planning:
+===================
+
+- Replace all uses of g_signals with my own event stuff. None of this
+  needs to be public and my events are a lot more performant. [ DONE ]
+
+- Need to add a Changed event to GMimeHeaderList so that GMimeMessage
+  can listen to changes in the toplevel mime_part's headers. When they
+  change, we need to unset the cached header stream on the
+  GMimeMessage. (see the "Note:" comments in message_write_to_stream
+  and message_get_headers, while this hack works, it'd be nicer if we
+  did it based on event callbacks) [ DONE ]
+
+- Get rid of GMimeSession and replace it with
+  GMimePassphraseRequestFunc or something. See GpgMe's passphrase
+  request callback signature for ideas. [ DONE ]
+
+- Consider optionally using GpgMe so that we can support S/MIME?
+  [ DONE: but needs testing ]
+
+- Consider GCancellable and GError for GMimeStreams and
+  GMimeParser... GError being far more important than
+  GCancellable. GCancellable could be nice to have for network
+  streams, though... [ POSTPONED ]
+
+- Add a GIO-backed GMimeStream and bump glib dep to 2.16 [ DONE ]
+
+- Add a g_mime_part_get_best_content_encoding()? [ DONE ]
+
+- Rename GMimeBestEncoding enum to GMimeEncodingConstraint? [ DONE ]
+
+  This might be a better name for the enum to reflect what it's
+  actually meant for. Maybe also move it from gmime-filter-best.h to
+  gmime-encodings.h?
+
+- How about a g_mime_part_get_best_charset()? This one could be
+  awkward since it depends on the content being text and also encoded
+  in UTF-8... [ CONSIDERING ]
+
+- Re-add a g_mime_message_get_body()? [ DONE ]
+
+
+Other:
+======
+
+
+- make thread-safe? some stuff already is, like the gmime-iconv code
+and some of the other charset stuff. Streams and other objects,
+however, are not. How can I do this...? And is it really needed?
+
+- Possibly make the GMime parser incremental.
+
+- modify address parser:
+
+ on usenet it's not uncommon to have header like "From: Joe Bob"
+ where people use no address at all to avoid spammers
+ ok
+ It would be nice if internet-address handled this
+ have ->name == "Joe Bob" and ->value.addr == NULL
+ oh, so only support writing them? ah, that should be easy
+ It looks like the else clause on line 582 is where a "Joe Bob" string fails
+ I was pondering how I could possibly parse that as a name :)
+ No, I am asking about parsing
+ oh
+ It would be nice for internet_address_parse_string() to return an 
+InternetAddress with a name of "Joe Bob" and a NULL addr
+ ah, okay
+ I guess I can do that
+ I'll have to modify my internet_address_to_string code to handle that too
+ but that should be easy
+
+- S/MIMEv3: http://www.ietf.org/html.charters/smime-charter.html
+
+
+
+
+Ideas for GMime "3.0"
+=====================
+
+- GMimeStream's should take GError args so apps don't have to rely on
+  errno (really needed for apps that implement ssl streams or other
+  stream types which might not map well to libc's errno values)
+
+  - Maybe even drop GMimeStreams and use GIO?
+  - If not, take GCancellables?
+
+- GMimeParser should also take a GError arg and/or return int error
+  codes.
+
+- Would be nice if gmime-sharp could take System.IO.Stream in addition
+  to GMime.Stream.
+
+- Combine GMimeGpgContext and GMimePkcs7Context by using GpgMe for
+  both. This could allow g_mime_multipart_encrypted_decrypt() and
+  g_mime_multipart_signed_verify() to set the appropriate protocol on
+  the CryptoContext so that the caller wouldn't have to figure that
+  out themselves. We'd actually be able to get rid of the need for
+  a GMimeCryptoContext parameter altogether if we could rely on
+  the backend using a gpg-agent for password requests.
+
+
+All questions and comments should be directed toward the author,
+Jeffrey Stedfast 
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644
index 0000000..8f94582
--- /dev/null
+++ b/acinclude.m4
@@ -0,0 +1,177 @@
+dnl dolt, a replacement for libtool
+dnl Copyright © 2007-2008 Josh Triplett 
+dnl Copying and distribution of this file, with or without modification,
+dnl are permitted in any medium without royalty provided the copyright
+dnl notice and this notice are preserved.
+dnl
+dnl To use dolt, invoke the DOLT macro immediately after the libtool macros.
+dnl Optionally, copy this file into acinclude.m4, to avoid the need to have it
+dnl installed when running autoconf on your project.
+
+AC_DEFUN([DOLT], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+# dolt, a replacement for libtool
+# Josh Triplett 
+AC_PATH_PROG(DOLT_BASH, bash)
+AC_MSG_CHECKING([if dolt supports this host])
+dolt_supported=yes
+if test x$DOLT_BASH = x; then
+    dolt_supported=no
+fi
+if test x$GCC != xyes; then
+    dolt_supported=no
+fi
+case $host in
+i?86-*-linux*|x86_64-*-linux*|powerpc-*-linux* \
+|amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*)
+    pic_options='-fPIC'
+    ;;
+i?86-apple-darwin*)
+    pic_options='-fno-common'
+    ;;
+*)
+    dolt_supported=no
+    ;;
+esac
+if test x$dolt_supported = xno ; then
+    AC_MSG_RESULT([no, falling back to libtool])
+    LTCOMPILE='$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(COMPILE)'
+    LTCXXCOMPILE='$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXXCOMPILE)'
+else
+    AC_MSG_RESULT([yes, replacing libtool])
+
+dnl Start writing out doltcompile.
+    cat <<__DOLTCOMPILE__EOF__ >doltcompile
+#!$DOLT_BASH
+__DOLTCOMPILE__EOF__
+    cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+args=("$[]@")
+for ((arg=0; arg<${#args@<:@@@:>@}; arg++)) ; do
+    if test x"${args@<:@$arg@:>@}" = x-o ; then
+        objarg=$((arg+1))
+        break
+    fi
+done
+if test x$objarg = x ; then
+    echo 'Error: no -o on compiler command line' 1>&2
+    exit 1
+fi
+lo="${args@<:@$objarg@:>@}"
+obj="${lo%.lo}"
+if test x"$lo" = x"$obj" ; then
+    echo "Error: libtool object file name \"$lo\" does not end in .lo" 1>&2
+    exit 1
+fi
+objbase="${obj##*/}"
+__DOLTCOMPILE__EOF__
+
+dnl Write out shared compilation code.
+    if test x$enable_shared = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+libobjdir="${obj%$objbase}.libs"
+if test ! -d "$libobjdir" ; then
+    mkdir_out="$(mkdir "$libobjdir" 2>&1)"
+    mkdir_ret=$?
+    if test "$mkdir_ret" -ne 0 && test ! -d "$libobjdir" ; then
+	echo "$mkdir_out" 1>&2
+        exit $mkdir_ret
+    fi
+fi
+pic_object="$libobjdir/$objbase.o"
+args@<:@$objarg@:>@="$pic_object"
+__DOLTCOMPILE__EOF__
+    cat <<__DOLTCOMPILE__EOF__ >>doltcompile
+"\${args@<:@@@:>@}" $pic_options -DPIC || exit \$?
+__DOLTCOMPILE__EOF__
+    fi
+
+dnl Write out static compilation code.
+dnl Avoid duplicate compiler output if also building shared objects.
+    if test x$enable_static = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+non_pic_object="$obj.o"
+args@<:@$objarg@:>@="$non_pic_object"
+__DOLTCOMPILE__EOF__
+        if test x$enable_shared = xyes; then
+            cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+"${args@<:@@@:>@}" >/dev/null 2>&1 || exit $?
+__DOLTCOMPILE__EOF__
+        else
+            cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+"${args@<:@@@:>@}" || exit $?
+__DOLTCOMPILE__EOF__
+        fi
+    fi
+
+dnl Write out the code to write the .lo file.
+dnl The second line of the .lo file must match "^# Generated by .*libtool"
+    cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+{
+echo "# $lo - a libtool object file"
+echo "# Generated by doltcompile, not libtool"
+__DOLTCOMPILE__EOF__
+
+    if test x$enable_shared = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo "pic_object='.libs/${objbase}.o'"
+__DOLTCOMPILE__EOF__
+    else
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo pic_object=none
+__DOLTCOMPILE__EOF__
+    fi
+
+    if test x$enable_static = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo "non_pic_object='${objbase}.o'"
+__DOLTCOMPILE__EOF__
+    else
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo non_pic_object=none
+__DOLTCOMPILE__EOF__
+    fi
+
+    cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+} > "$lo"
+__DOLTCOMPILE__EOF__
+
+dnl Done writing out doltcompile; substitute it for libtool compilation.
+    chmod +x doltcompile
+    LTCOMPILE='$(top_builddir)/doltcompile $(COMPILE)'
+    LTCXXCOMPILE='$(top_builddir)/doltcompile $(CXXCOMPILE)'
+
+dnl automake ignores LTCOMPILE and LTCXXCOMPILE when it has separate CFLAGS for
+dnl a target, so write out a libtool wrapper to handle that case.
+dnl Note that doltlibtool does not handle inferred tags or option arguments
+dnl without '=', because automake does not use them.
+    cat <<__DOLTLIBTOOL__EOF__ > doltlibtool
+#!$DOLT_BASH
+__DOLTLIBTOOL__EOF__
+    cat <<'__DOLTLIBTOOL__EOF__' >>doltlibtool
+top_builddir_slash="${0%%doltlibtool}"
+: ${top_builddir_slash:=./}
+args=()
+modeok=false
+tagok=false
+for arg in "$[]@"; do
+    case "$arg" in
+        --mode=compile) modeok=true ;;
+        --tag=CC|--tag=CXX) tagok=true ;;
+        *) args@<:@${#args[@]}@:>@="$arg" ;;
+    esac
+done
+if $modeok && $tagok ; then
+    . ${top_builddir_slash}doltcompile "${args@<:@@@:>@}"
+else
+    exec ${top_builddir_slash}libtool "$[]@"
+fi
+__DOLTLIBTOOL__EOF__
+
+dnl Done writing out doltlibtool; substitute it for libtool.
+    chmod +x doltlibtool
+    LIBTOOL='$(top_builddir)/doltlibtool'
+fi
+AC_SUBST(LTCOMPILE)
+AC_SUBST(LTCXXCOMPILE)
+# end dolt
+])
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..9ae5b0f
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,11749 @@
+# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Configure paths for GLIB
+# Owen Taylor     1997-2001
+
+dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject,
+dnl gthread, or gio is specified in MODULES, pass to pkg-config
+dnl
+AC_DEFUN([AM_PATH_GLIB_2_0],
+[dnl 
+dnl Get the cflags and libraries from pkg-config
+dnl
+AC_ARG_ENABLE(glibtest, [  --disable-glibtest      do not try to compile and run a test GLIB program],
+		    , enable_glibtest=yes)
+
+  pkg_config_args=glib-2.0
+  for module in . $4
+  do
+      case "$module" in
+         gmodule) 
+             pkg_config_args="$pkg_config_args gmodule-2.0"
+         ;;
+         gmodule-no-export) 
+             pkg_config_args="$pkg_config_args gmodule-no-export-2.0"
+         ;;
+         gobject) 
+             pkg_config_args="$pkg_config_args gobject-2.0"
+         ;;
+         gthread) 
+             pkg_config_args="$pkg_config_args gthread-2.0"
+         ;;
+         gio*) 
+             pkg_config_args="$pkg_config_args $module-2.0"
+         ;;
+      esac
+  done
+
+  PKG_PROG_PKG_CONFIG([0.16])
+
+  no_glib=""
+
+  if test "x$PKG_CONFIG" = x ; then
+    no_glib=yes
+    PKG_CONFIG=no
+  fi
+
+  min_glib_version=ifelse([$1], ,2.0.0,$1)
+  AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
+
+  if test x$PKG_CONFIG != xno ; then
+    ## don't try to run the test against uninstalled libtool libs
+    if $PKG_CONFIG --uninstalled $pkg_config_args; then
+	  echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH"
+	  enable_glibtest=no
+    fi
+
+    if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then
+	  :
+    else
+	  no_glib=yes
+    fi
+  fi
+
+  if test x"$no_glib" = x ; then
+    GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
+    GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0`
+    GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+    GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable=glib_compile_resources gio-2.0`
+
+    GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args`
+    GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args`
+    glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+    if test "x$enable_glibtest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GLIB_CFLAGS"
+      LIBS="$GLIB_LIBS $LIBS"
+dnl
+dnl Now check if the installed GLIB is sufficiently new. (Also sanity
+dnl checks the results of pkg-config to some extent)
+dnl
+      rm -f conf.glibtest
+      AC_TRY_RUN([
+#include 
+#include 
+#include 
+
+int 
+main ()
+{
+  unsigned int major, minor, micro;
+  char *tmp_version;
+
+  fclose (fopen ("conf.glibtest", "w"));
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_glib_version");
+  if (sscanf(tmp_version, "%u.%u.%u", &major, &minor, µ) != 3) {
+     printf("%s, bad version string\n", "$min_glib_version");
+     exit(1);
+   }
+
+  if ((glib_major_version != $glib_config_major_version) ||
+      (glib_minor_version != $glib_config_minor_version) ||
+      (glib_micro_version != $glib_config_micro_version))
+    {
+      printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", 
+             $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
+             glib_major_version, glib_minor_version, glib_micro_version);
+      printf ("*** was found! If pkg-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GLib. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+      printf("*** to point to the correct configuration files\n");
+    } 
+  else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
+	   (glib_minor_version != GLIB_MINOR_VERSION) ||
+           (glib_micro_version != GLIB_MICRO_VERSION))
+    {
+      printf("*** GLIB header files (version %d.%d.%d) do not match\n",
+	     GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+	     glib_major_version, glib_minor_version, glib_micro_version);
+    }
+  else
+    {
+      if ((glib_major_version > major) ||
+        ((glib_major_version == major) && (glib_minor_version > minor)) ||
+        ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GLIB (%u.%u.%u) was found.\n",
+               glib_major_version, glib_minor_version, glib_micro_version);
+        printf("*** You need a version of GLIB newer than %u.%u.%u. The latest version of\n",
+	       major, minor, micro);
+        printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n");
+        printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_glib" = x ; then
+     AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version))
+     ifelse([$2], , :, [$2])     
+  else
+     AC_MSG_RESULT(no)
+     if test "$PKG_CONFIG" = "no" ; then
+       echo "*** A new enough version of pkg-config was not found."
+       echo "*** See http://www.freedesktop.org/software/pkgconfig/"
+     else
+       if test -f conf.glibtest ; then
+        :
+       else
+          echo "*** Could not run GLIB test program, checking why..."
+          ac_save_CFLAGS="$CFLAGS"
+          ac_save_LIBS="$LIBS"
+          CFLAGS="$CFLAGS $GLIB_CFLAGS"
+          LIBS="$LIBS $GLIB_LIBS"
+          AC_TRY_LINK([
+#include 
+#include 
+],      [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ],
+        [ echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GLIB or finding the wrong"
+          echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+	  echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
+        [ echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GLIB is incorrectly installed."])
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GLIB_CFLAGS=""
+     GLIB_LIBS=""
+     GLIB_GENMARSHAL=""
+     GOBJECT_QUERY=""
+     GLIB_MKENUMS=""
+     GLIB_COMPILE_RESOURCES=""
+     ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GLIB_CFLAGS)
+  AC_SUBST(GLIB_LIBS)
+  AC_SUBST(GLIB_GENMARSHAL)
+  AC_SUBST(GOBJECT_QUERY)
+  AC_SUBST(GLIB_MKENUMS)
+  AC_SUBST(GLIB_COMPILE_RESOURCES)
+  rm -f conf.glibtest
+])
+
+# gpgme.m4 - autoconf macro to detect GPGME.
+# Copyright (C) 2002, 2003, 2004 g10 Code GmbH
+#
+# 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 file 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.
+
+
+AC_DEFUN([_AM_PATH_GPGME_CONFIG],
+[ AC_ARG_WITH(gpgme-prefix,
+            AC_HELP_STRING([--with-gpgme-prefix=PFX],
+                           [prefix where GPGME is installed (optional)]),
+     gpgme_config_prefix="$withval", gpgme_config_prefix="")
+  if test "x$gpgme_config_prefix" != x ; then
+      GPGME_CONFIG="$gpgme_config_prefix/bin/gpgme-config"
+  fi
+  AC_PATH_PROG(GPGME_CONFIG, gpgme-config, no)
+
+  if test "$GPGME_CONFIG" != "no" ; then
+    gpgme_version=`$GPGME_CONFIG --version`
+  fi
+  gpgme_version_major=`echo $gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
+  gpgme_version_minor=`echo $gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
+  gpgme_version_micro=`echo $gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'`
+])
+
+dnl AM_PATH_GPGME([MINIMUM-VERSION,
+dnl               [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+dnl Test for libgpgme and define GPGME_CFLAGS and GPGME_LIBS.
+dnl
+AC_DEFUN([AM_PATH_GPGME],
+[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl
+  tmp=ifelse([$1], ,1:0.4.2,$1)
+  if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+     req_gpgme_api=`echo "$tmp"     | sed 's/\(.*\):\(.*\)/\1/'`
+     min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+  else
+     req_gpgme_api=0
+     min_gpgme_version="$tmp"
+  fi
+
+  AC_MSG_CHECKING(for GPGME - version >= $min_gpgme_version)
+  ok=no
+  if test "$GPGME_CONFIG" != "no" ; then
+    req_major=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
+    req_minor=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
+    req_micro=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
+    if test "$gpgme_version_major" -gt "$req_major"; then
+        ok=yes
+    else 
+        if test "$gpgme_version_major" -eq "$req_major"; then
+            if test "$gpgme_version_minor" -gt "$req_minor"; then
+               ok=yes
+            else
+               if test "$gpgme_version_minor" -eq "$req_minor"; then
+                   if test "$gpgme_version_micro" -ge "$req_micro"; then
+                     ok=yes
+                   fi
+               fi
+            fi
+        fi
+    fi
+  fi
+  if test $ok = yes; then
+     # If we have a recent GPGME, we should also check that the
+     # API is compatible.
+     if test "$req_gpgme_api" -gt 0 ; then
+        tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0`
+        if test "$tmp" -gt 0 ; then
+           if test "$req_gpgme_api" -ne "$tmp" ; then
+             ok=no
+           fi
+        fi
+     fi
+  fi
+  if test $ok = yes; then
+    GPGME_CFLAGS=`$GPGME_CONFIG --cflags`
+    GPGME_LIBS=`$GPGME_CONFIG --libs`
+    AC_MSG_RESULT(yes)
+    ifelse([$2], , :, [$2])
+  else
+    GPGME_CFLAGS=""
+    GPGME_LIBS=""
+    AC_MSG_RESULT(no)
+    ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GPGME_CFLAGS)
+  AC_SUBST(GPGME_LIBS)
+])
+
+dnl AM_PATH_GPGME_PTH([MINIMUM-VERSION,
+dnl                   [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+dnl Test for libgpgme and define GPGME_PTH_CFLAGS and GPGME_PTH_LIBS.
+dnl
+AC_DEFUN([AM_PATH_GPGME_PTH],
+[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl
+  tmp=ifelse([$1], ,1:0.4.2,$1)
+  if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+     req_gpgme_api=`echo "$tmp"     | sed 's/\(.*\):\(.*\)/\1/'`
+     min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+  else
+     req_gpgme_api=0
+     min_gpgme_version="$tmp"
+  fi
+
+  AC_MSG_CHECKING(for GPGME Pth - version >= $min_gpgme_version)
+  ok=no
+  if test "$GPGME_CONFIG" != "no" ; then
+    if `$GPGME_CONFIG --thread=pth 2> /dev/null` ; then
+      req_major=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
+      req_minor=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
+      req_micro=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
+      if test "$gpgme_version_major" -gt "$req_major"; then
+        ok=yes
+      else 
+        if test "$gpgme_version_major" -eq "$req_major"; then
+          if test "$gpgme_version_minor" -gt "$req_minor"; then
+            ok=yes
+          else
+            if test "$gpgme_version_minor" -eq "$req_minor"; then
+              if test "$gpgme_version_micro" -ge "$req_micro"; then
+                ok=yes
+              fi
+            fi
+          fi
+        fi
+      fi
+    fi
+  fi
+  if test $ok = yes; then
+     # If we have a recent GPGME, we should also check that the
+     # API is compatible.
+     if test "$req_gpgme_api" -gt 0 ; then
+        tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0`
+        if test "$tmp" -gt 0 ; then
+           if test "$req_gpgme_api" -ne "$tmp" ; then
+             ok=no
+           fi
+        fi
+     fi
+  fi
+  if test $ok = yes; then
+    GPGME_PTH_CFLAGS=`$GPGME_CONFIG --thread=pth --cflags`
+    GPGME_PTH_LIBS=`$GPGME_CONFIG --thread=pth --libs`
+    AC_MSG_RESULT(yes)
+    ifelse([$2], , :, [$2])
+  else
+    GPGME_PTH_CFLAGS=""
+    GPGME_PTH_LIBS=""
+    AC_MSG_RESULT(no)
+    ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GPGME_PTH_CFLAGS)
+  AC_SUBST(GPGME_PTH_LIBS)
+])
+
+dnl AM_PATH_GPGME_PTHREAD([MINIMUM-VERSION,
+dnl                       [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+dnl Test for libgpgme and define GPGME_PTHREAD_CFLAGS
+dnl  and GPGME_PTHREAD_LIBS.
+dnl
+AC_DEFUN([AM_PATH_GPGME_PTHREAD],
+[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl
+  tmp=ifelse([$1], ,1:0.4.2,$1)
+  if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+     req_gpgme_api=`echo "$tmp"     | sed 's/\(.*\):\(.*\)/\1/'`
+     min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+  else
+     req_gpgme_api=0
+     min_gpgme_version="$tmp"
+  fi
+
+  AC_MSG_CHECKING(for GPGME pthread - version >= $min_gpgme_version)
+  ok=no
+  if test "$GPGME_CONFIG" != "no" ; then
+    if `$GPGME_CONFIG --thread=pthread 2> /dev/null` ; then
+      req_major=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
+      req_minor=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
+      req_micro=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
+      if test "$gpgme_version_major" -gt "$req_major"; then
+        ok=yes
+      else 
+        if test "$gpgme_version_major" -eq "$req_major"; then
+          if test "$gpgme_version_minor" -gt "$req_minor"; then
+            ok=yes
+          else
+            if test "$gpgme_version_minor" -eq "$req_minor"; then
+              if test "$gpgme_version_micro" -ge "$req_micro"; then
+                ok=yes
+              fi
+            fi
+          fi
+        fi
+      fi
+    fi
+  fi
+  if test $ok = yes; then
+     # If we have a recent GPGME, we should also check that the
+     # API is compatible.
+     if test "$req_gpgme_api" -gt 0 ; then
+        tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0`
+        if test "$tmp" -gt 0 ; then
+           if test "$req_gpgme_api" -ne "$tmp" ; then
+             ok=no
+           fi
+        fi
+     fi
+  fi
+  if test $ok = yes; then
+    GPGME_PTHREAD_CFLAGS=`$GPGME_CONFIG --thread=pthread --cflags`
+    GPGME_PTHREAD_LIBS=`$GPGME_CONFIG --thread=pthread --libs`
+    AC_MSG_RESULT(yes)
+    ifelse([$2], , :, [$2])
+  else
+    GPGME_PTHREAD_CFLAGS=""
+    GPGME_PTHREAD_LIBS=""
+    AC_MSG_RESULT(no)
+    ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GPGME_PTHREAD_CFLAGS)
+  AC_SUBST(GPGME_PTHREAD_LIBS)
+])
+
+
+dnl AM_PATH_GPGME_GLIB([MINIMUM-VERSION,
+dnl               [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+dnl Test for libgpgme-glib and define GPGME_GLIB_CFLAGS and GPGME_GLIB_LIBS.
+dnl
+AC_DEFUN([AM_PATH_GPGME_GLIB],
+[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl
+  tmp=ifelse([$1], ,1:0.4.2,$1)
+  if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+     req_gpgme_api=`echo "$tmp"     | sed 's/\(.*\):\(.*\)/\1/'`
+     min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+  else
+     req_gpgme_api=0
+     min_gpgme_version="$tmp"
+  fi
+
+  AC_MSG_CHECKING(for GPGME - version >= $min_gpgme_version)
+  ok=no
+  if test "$GPGME_CONFIG" != "no" ; then
+    req_major=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
+    req_minor=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
+    req_micro=`echo $min_gpgme_version | \
+               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
+    if test "$gpgme_version_major" -gt "$req_major"; then
+        ok=yes
+    else 
+        if test "$gpgme_version_major" -eq "$req_major"; then
+            if test "$gpgme_version_minor" -gt "$req_minor"; then
+               ok=yes
+            else
+               if test "$gpgme_version_minor" -eq "$req_minor"; then
+                   if test "$gpgme_version_micro" -ge "$req_micro"; then
+                     ok=yes
+                   fi
+               fi
+            fi
+        fi
+    fi
+  fi
+  if test $ok = yes; then
+     # If we have a recent GPGME, we should also check that the
+     # API is compatible.
+     if test "$req_gpgme_api" -gt 0 ; then
+        tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0`
+        if test "$tmp" -gt 0 ; then
+           if test "$req_gpgme_api" -ne "$tmp" ; then
+             ok=no
+           fi
+        fi
+     fi
+  fi
+  if test $ok = yes; then
+    GPGME_GLIB_CFLAGS=`$GPGME_CONFIG --glib --cflags`
+    GPGME_GLIB_LIBS=`$GPGME_CONFIG --glib --libs`
+    AC_MSG_RESULT(yes)
+    ifelse([$2], , :, [$2])
+  else
+    GPGME_GLIB_CFLAGS=""
+    GPGME_GLIB_LIBS=""
+    AC_MSG_RESULT(no)
+    ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GPGME_GLIB_CFLAGS)
+  AC_SUBST(GPGME_GLIB_LIBS)
+])
+
+
+dnl -*- mode: autoconf -*-
+
+# serial 1
+
+dnl Usage:
+dnl   GTK_DOC_CHECK([minimum-gtk-doc-version])
+AC_DEFUN([GTK_DOC_CHECK],
+[
+  AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+  AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
+  AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
+
+  dnl check for tools we added during development
+  AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check])
+  AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true])
+  AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf])
+
+  dnl for overriding the documentation installation directory
+  AC_ARG_WITH([html-dir],
+    AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),,
+    [with_html_dir='${datadir}/gtk-doc/html'])
+  HTML_DIR="$with_html_dir"
+  AC_SUBST([HTML_DIR])
+
+  dnl enable/disable documentation building
+  AC_ARG_ENABLE([gtk-doc],
+    AS_HELP_STRING([--enable-gtk-doc],
+                   [use gtk-doc to build documentation [[default=no]]]),,
+    [enable_gtk_doc=no])
+
+  if test x$enable_gtk_doc = xyes; then
+    ifelse([$1],[],
+      [PKG_CHECK_EXISTS([gtk-doc],,
+                        AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))],
+      [PKG_CHECK_EXISTS([gtk-doc >= $1],,
+                        AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))])
+    dnl don't check for glib if we build glib
+    if test "x$PACKAGE_NAME" != "xglib"; then
+      dnl don't fail if someone does not have glib
+      PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0,,)
+    fi
+  fi
+
+  AC_MSG_CHECKING([whether to build gtk-doc documentation])
+  AC_MSG_RESULT($enable_gtk_doc)
+
+  dnl enable/disable output formats
+  AC_ARG_ENABLE([gtk-doc-html],
+    AS_HELP_STRING([--enable-gtk-doc-html],
+                   [build documentation in html format [[default=yes]]]),,
+    [enable_gtk_doc_html=yes])
+    AC_ARG_ENABLE([gtk-doc-pdf],
+      AS_HELP_STRING([--enable-gtk-doc-pdf],
+                     [build documentation in pdf format [[default=no]]]),,
+      [enable_gtk_doc_pdf=no])
+
+  if test -z "$GTKDOC_MKPDF"; then
+    enable_gtk_doc_pdf=no
+  fi
+
+
+  AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes])
+  AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes])
+  AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes])
+  AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"])
+  AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"])
+])
+
+# iconv.m4 serial 11 (gettext-0.18.1)
+dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+  dnl those with the standalone portable GNU libiconv installed).
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed libiconv and not disabled its use
+  dnl via --without-libiconv-prefix, he wants to use it. The first
+  dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+  am_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+  AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    AC_TRY_LINK([#include 
+#include ],
+      [iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);],
+      [am_cv_func_iconv=yes])
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      AC_TRY_LINK([#include 
+#include ],
+        [iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);],
+        [am_cv_lib_iconv=yes]
+        [am_cv_func_iconv=yes])
+      LIBS="$am_save_LIBS"
+    fi
+  ])
+  if test "$am_cv_func_iconv" = yes; then
+    AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
+      dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10.
+      am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      AC_TRY_RUN([
+#include 
+#include 
+int main ()
+{
+  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+     returns.  */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static const char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          return 1;
+      }
+  }
+  /* Test against Solaris 10 bug: Failures are not distinguishable from
+     successful returns.  */
+  {
+    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+    if (cd_ascii_to_88591 != (iconv_t)(-1))
+      {
+        static const char input[] = "\263";
+        char buf[10];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_ascii_to_88591,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          return 1;
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          return 1;
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  if (/* Try standardized names.  */
+      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+      /* Try IRIX, OSF/1 names.  */
+      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+      /* Try AIX names.  */
+      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+      /* Try HP-UX names.  */
+      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+    return 1;
+  return 0;
+}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no],
+        [case "$host_os" in
+           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+           *)            am_cv_func_iconv_works="guessing yes" ;;
+         esac])
+      LIBS="$am_save_LIBS"
+    ])
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+    AC_DEFINE([HAVE_ICONV], [1],
+      [Define if you have the iconv() function and it works.])
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    AC_MSG_CHECKING([how to link with libiconv])
+    AC_MSG_RESULT([$LIBICONV])
+  else
+    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+    dnl either.
+    CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+  AC_SUBST([LIBICONV])
+  AC_SUBST([LTLIBICONV])
+])
+
+dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
+dnl avoid warnings like
+dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
+dnl This is tricky because of the way 'aclocal' is implemented:
+dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
+dnl   Otherwise aclocal's initial scan pass would miss the macro definition.
+dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
+dnl   Otherwise aclocal would emit many "Use of uninitialized value $1"
+dnl   warnings.
+m4_define([gl_iconv_AC_DEFUN],
+  m4_version_prereq([2.64],
+    [[AC_DEFUN_ONCE(
+        [$1], [$2])]],
+    [[AC_DEFUN(
+        [$1], [$2])]]))
+gl_iconv_AC_DEFUN([AM_ICONV],
+[
+  AM_ICONV_LINK
+  if test "$am_cv_func_iconv" = yes; then
+    AC_MSG_CHECKING([for iconv declaration])
+    AC_CACHE_VAL([am_cv_proto_iconv], [
+      AC_TRY_COMPILE([
+#include 
+#include 
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"])
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    AC_MSG_RESULT([
+         $am_cv_proto_iconv])
+    AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
+      [Define as const if the declaration of iconv() needs const.])
+  fi
+])
+
+# lib-ld.m4 serial 4 (gettext-0.18)
+dnl Copyright (C) 1996-2003, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+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([acl_cv_path_LD],
+[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
+      acl_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.
+      case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+      *GNU* | *'with BFD'*)
+        test "$with_gnu_ld" != no && break ;;
+      *)
+        test "$with_gnu_ld" != yes && break ;;
+      esac
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_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_LIB_PROG_LD_GNU
+])
+
+# lib-link.m4 serial 21 (gettext-0.18)
+dnl Copyright (C) 2001-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.54])
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  pushdef([Name],[translit([$1],[./-], [___])])
+  pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+    AC_LIB_LINKFLAGS_BODY([$1], [$2])
+    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+    ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
+  ])
+  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
+  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+  dnl results of this search when this library appears as a dependency.
+  HAVE_LIB[]NAME=yes
+  popdef([NAME])
+  popdef([Name])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. The missing-message
+dnl defaults to 'no' and may contain additional hints for the user.
+dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
+dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  pushdef([Name],[translit([$1],[./-], [___])])
+  pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed lib[]Name and not disabled its use
+  dnl via --without-lib[]Name-prefix, he wants to use it.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+    ac_save_LIBS="$LIBS"
+    dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
+    dnl because these -l options might require -L options that are present in
+    dnl LIBS. -l options benefit only from the -L options listed before it.
+    dnl Otherwise, add it to the front of LIBS, because it may be a static
+    dnl library that depends on another static library that is present in LIBS.
+    dnl Static libraries benefit only from the static libraries listed after
+    dnl it.
+    case " $LIB[]NAME" in
+      *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
+      *)       LIBS="$LIB[]NAME $LIBS" ;;
+    esac
+    AC_TRY_LINK([$3], [$4],
+      [ac_cv_lib[]Name=yes],
+      [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
+    LIBS="$ac_save_LIBS"
+  ])
+  if test "$ac_cv_lib[]Name" = yes; then
+    HAVE_LIB[]NAME=yes
+    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
+    AC_MSG_CHECKING([how to link with lib[]$1])
+    AC_MSG_RESULT([$LIB[]NAME])
+  else
+    HAVE_LIB[]NAME=no
+    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+    dnl $INC[]NAME either.
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LIB[]NAME=
+    LTLIB[]NAME=
+    LIB[]NAME[]_PREFIX=
+  fi
+  AC_SUBST([HAVE_LIB]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
+  popdef([NAME])
+  popdef([Name])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl   acl_libext,
+dnl   acl_shlibext,
+dnl   acl_hardcode_libdir_flag_spec,
+dnl   acl_hardcode_libdir_separator,
+dnl   acl_hardcode_direct,
+dnl   acl_hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+  dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
+  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
+  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
+  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+  AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  ])
+  wl="$acl_cv_wl"
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  dnl Determine whether the user wants rpath handling at all.
+  AC_ARG_ENABLE([rpath],
+    [  --disable-rpath         do not hardcode runtime library paths],
+    :, enable_rpath=yes)
+])
+
+dnl AC_LIB_FROMPACKAGE(name, package)
+dnl declares that libname comes from the given package. The configure file
+dnl will then not have a --with-libname-prefix option but a
+dnl --with-package-prefix option. Several libraries can come from the same
+dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
+dnl macro call that searches for libname.
+AC_DEFUN([AC_LIB_FROMPACKAGE],
+[
+  pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  define([acl_frompackage_]NAME, [$2])
+  popdef([NAME])
+  pushdef([PACK],[$2])
+  pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-],
+                                  [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  define([acl_libsinpackage_]PACKUP,
+    m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1])
+  popdef([PACKUP])
+  popdef([PACK])
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                                [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
+  pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-],
+                                  [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
+  dnl Autoconf >= 2.61 supports dots in --with options.
+  pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_ARG_WITH(P_A_C_K[-prefix],
+[[  --with-]]P_A_C_K[[-prefix[=DIR]  search for ]PACKLIBS[ in DIR/include and DIR/lib
+  --without-]]P_A_C_K[[-prefix     don't search for ]PACKLIBS[ in includedir and libdir]],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+])
+  dnl Search the library and its dependencies in $additional_libdir and
+  dnl $LDFLAGS. Using breadth-first-seach.
+  LIB[]NAME=
+  LTLIB[]NAME=
+  INC[]NAME=
+  LIB[]NAME[]_PREFIX=
+  dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
+  dnl computed. So it has to be reset here.
+  HAVE_LIB[]NAME=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='$1 $2'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+        dnl or AC_LIB_HAVE_LINKFLAGS call.
+        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+          else
+            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+            dnl that this library doesn't exist. So just drop it.
+            :
+          fi
+        else
+          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+          dnl and the already constructed $LIBNAME/$LTLIBNAME.
+          found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+            dnl The same code as in the loop below:
+            dnl First look for a shared library.
+            if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+            dnl Then look for a static library.
+            if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIB[]NAME; do
+              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  dnl First look for a shared library.
+                  if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                  dnl Then look for a static library.
+                  if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+            dnl Found the library.
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+              dnl Linking with a shared library. We attempt to hardcode its
+              dnl directory into the executable's runpath, unless it's the
+              dnl standard /usr/lib.
+              if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                dnl No hardcoding is needed.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+              else
+                dnl Use an explicit option to hardcode DIR into the resulting
+                dnl binary.
+                dnl Potentially add DIR to ltrpathdirs.
+                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                dnl The hardcoding into $LIBNAME is system dependent.
+                if test "$acl_hardcode_direct" = yes; then
+                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+                  dnl resulting binary.
+                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                    dnl Use an explicit option to hardcode DIR into the resulting
+                    dnl binary.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    dnl Potentially add DIR to rpathdirs.
+                    dnl The rpathdirs will be appended to $LIBNAME at the end.
+                    haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                    dnl Rely on "-L$found_dir".
+                    dnl But don't add it if it's already contained in the LDFLAGS
+                    dnl or the already constructed $LIBNAME
+                    haveit=
+                    for x in $LDFLAGS $LIB[]NAME; do
+                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    else
+                      dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
+                      dnl here, because this doesn't fit in flags passed to the
+                      dnl compiler. So give up. No hardcoding. This affects only
+                      dnl very old systems.
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                dnl Linking with a static library.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+              else
+                dnl We shouldn't come here, but anyway it's good to have a
+                dnl fallback.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+              fi
+            fi
+            dnl Assume the include files are nearby.
+            additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = '$1'; then
+                  LIB[]NAME[]_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = '$1'; then
+                  LIB[]NAME[]_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+              dnl Potentially add $additional_includedir to $INCNAME.
+              dnl But don't add it
+              dnl   1. if it's the standard /usr/include,
+              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
+              dnl   3. if it's already present in $CPPFLAGS or the already
+              dnl      constructed $INCNAME,
+              dnl   4. if it doesn't exist as a directory.
+              if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INC[]NAME; do
+                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                      dnl Really add $additional_includedir to $INCNAME.
+                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+            dnl Look for dependencies.
+            if test -n "$found_la"; then
+              dnl Read the .la file. It defines the variables
+              dnl dlname, library_names, old_library, dependency_libs, current,
+              dnl age, revision, installed, dlopen, dlpreopen, libdir.
+              save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+              dnl We use only dependency_libs.
+              for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+                    dnl But don't add it
+                    dnl   1. if it's the standard /usr/lib,
+                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
+                    dnl   3. if it's already present in $LDFLAGS or the already
+                    dnl      constructed $LIBNAME,
+                    dnl   4. if it doesn't exist as a directory.
+                    if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LIBNAME.
+                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LTLIBNAME.
+                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                      dnl Potentially add DIR to rpathdirs.
+                      dnl The rpathdirs will be appended to $LIBNAME at the end.
+                      haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                      dnl Potentially add DIR to ltrpathdirs.
+                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                      haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                    dnl Handle this in the next round.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                    dnl Handle this in the next round. Throw away the .la's
+                    dnl directory; it is already contained in a preceding -L
+                    dnl option.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                    dnl Most likely an immediate library name.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+            dnl Didn't find the library; assume it is in the system directories
+            dnl known to the linker and runtime loader. (All the system
+            dnl directories known to the linker should also be known to the
+            dnl runtime loader, otherwise the system is severely misconfigured.)
+            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+      dnl Weird platform: only the last -rpath option counts, the user must
+      dnl pass all path elements in one option. We can arrange that for a
+      dnl single library, but not when more than one $LIBNAMEs are used.
+      alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+      dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
+      acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+    else
+      dnl The -rpath options are cumulative.
+      for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+    dnl When using libtool, the option that works for both libraries and
+    dnl executables is -R. The -R options are cumulative.
+    for found_dir in $ltrpathdirs; do
+      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+    done
+  fi
+  popdef([P_A_C_K])
+  popdef([PACKLIBS])
+  popdef([PACKUP])
+  popdef([PACK])
+  popdef([NAME])
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+  for element in [$2]; do
+    haveit=
+    for x in $[$1]; do
+      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      [$1]="${[$1]}${[$1]:+ }$element"
+    fi
+  done
+])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+  AC_REQUIRE([AC_LIB_RPATH])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  $1=
+  if test "$enable_rpath" != no; then
+    if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+      dnl Use an explicit option to hardcode directories into the resulting
+      dnl binary.
+      rpathdirs=
+      next=
+      for opt in $2; do
+        if test -n "$next"; then
+          dir="$next"
+          dnl No need to hardcode the standard /usr/lib.
+          if test "X$dir" != "X/usr/$acl_libdirstem" \
+             && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+            rpathdirs="$rpathdirs $dir"
+          fi
+          next=
+        else
+          case $opt in
+            -L) next=yes ;;
+            -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
+                 dnl No need to hardcode the standard /usr/lib.
+                 if test "X$dir" != "X/usr/$acl_libdirstem" \
+                    && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+                   rpathdirs="$rpathdirs $dir"
+                 fi
+                 next= ;;
+            *) next= ;;
+          esac
+        fi
+      done
+      if test "X$rpathdirs" != "X"; then
+        if test -n ""$3""; then
+          dnl libtool is used for linking. Use -R options.
+          for dir in $rpathdirs; do
+            $1="${$1}${$1:+ }-R$dir"
+          done
+        else
+          dnl The linker is used for linking directly.
+          if test -n "$acl_hardcode_libdir_separator"; then
+            dnl Weird platform: only the last -rpath option counts, the user
+            dnl must pass all path elements in one option.
+            alldirs=
+            for dir in $rpathdirs; do
+              alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+            done
+            acl_save_libdir="$libdir"
+            libdir="$alldirs"
+            eval flag=\"$acl_hardcode_libdir_flag_spec\"
+            libdir="$acl_save_libdir"
+            $1="$flag"
+          else
+            dnl The -rpath options are cumulative.
+            for dir in $rpathdirs; do
+              acl_save_libdir="$libdir"
+              libdir="$dir"
+              eval flag=\"$acl_hardcode_libdir_flag_spec\"
+              libdir="$acl_save_libdir"
+              $1="${$1}${$1:+ }$flag"
+            done
+          fi
+        fi
+      fi
+    fi
+  fi
+  AC_SUBST([$1])
+])
+
+# lib-prefix.m4 serial 7 (gettext-0.18)
+dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib-prefix],
+[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+  --without-lib-prefix    don't search for libraries in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+      fi
+    fi
+])
+  if test $use_additional = yes; then
+    dnl Potentially add $additional_includedir to $CPPFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/include,
+    dnl   2. if it's already present in $CPPFLAGS,
+    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_includedir" != "X/usr/include"; then
+      haveit=
+      for x in $CPPFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-I$additional_includedir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_includedir" = "X/usr/local/include"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_includedir"; then
+            dnl Really add $additional_includedir to $CPPFLAGS.
+            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+          fi
+        fi
+      fi
+    fi
+    dnl Potentially add $additional_libdir to $LDFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/lib,
+    dnl   2. if it's already present in $LDFLAGS,
+    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+      haveit=
+      for x in $LDFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-L$additional_libdir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_libdir"; then
+            dnl Really add $additional_libdir to $LDFLAGS.
+            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+          fi
+        fi
+      fi
+    fi
+  fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+  dnl Unfortunately, prefix and exec_prefix get only finally determined
+  dnl at the end of configure.
+  if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  $1
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a variable acl_libdirstem, containing the basename of the libdir, either
+dnl   "lib" or "lib64" or "lib/64",
+dnl - a variable acl_libdirstem2, as a secondary possible value for
+dnl   acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
+dnl   "lib/amd64".
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+  dnl There is no formal standard regarding lib and lib64.
+  dnl On glibc systems, the current practice is that on a system supporting
+  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+  dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
+  dnl the compiler's default mode by looking at the compiler's library search
+  dnl path. If at least one of its elements ends in /lib64 or points to a
+  dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
+  dnl Otherwise we use the default, namely "lib".
+  dnl On Solaris systems, the current practice is that on a system supporting
+  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+  dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
+  dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  acl_libdirstem=lib
+  acl_libdirstem2=
+  case "$host_os" in
+    solaris*)
+      dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+      dnl .
+      dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
+      dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
+      dnl symlink is missing, so we set acl_libdirstem2 too.
+      AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
+        [AC_EGREP_CPP([sixtyfour bits], [
+#ifdef _LP64
+sixtyfour bits
+#endif
+           ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
+        ])
+      if test $gl_cv_solaris_64bit = yes; then
+        acl_libdirstem=lib/64
+        case "$host_cpu" in
+          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
+          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+        esac
+      fi
+      ;;
+    *)
+      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+      if test -n "$searchpath"; then
+        acl_save_IFS="${IFS= 	}"; IFS=":"
+        for searchdir in $searchpath; do
+          if test -d "$searchdir"; then
+            case "$searchdir" in
+              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+              */../ | */.. )
+                # Better ignore directories of this form. They are misleading.
+                ;;
+              *) searchdir=`cd "$searchdir" && pwd`
+                 case "$searchdir" in
+                   */lib64 ) acl_libdirstem=lib64 ;;
+                 esac ;;
+            esac
+          fi
+        done
+        IFS="$acl_save_IFS"
+      fi
+      ;;
+  esac
+  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+])
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# 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.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+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
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+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'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    ='`$ECHO "$" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to ."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# 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
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # 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" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--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
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      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
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    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_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  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
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include 
+#endif
+
+#include 
+
+#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
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 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;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+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
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    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="-ldld"],
+	[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="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  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"
+    wl=$lt_prog_compiler_wl 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_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
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_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
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && 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
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = 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
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != 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 "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; 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
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+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
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+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"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    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.so
+      # instead of lib.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    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}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    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=`func_echo_all "$lib" | $SED '\''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'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$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"
+  # 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* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # 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
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  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.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      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}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # 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
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # 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'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_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}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$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 # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  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
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  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"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$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}${shared_ext}$versuffix ${libname}${shared_ext}$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.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=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
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+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 "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[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]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+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_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+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="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    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 <<_LT_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
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_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
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])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 $CC])
+  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.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname 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
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    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 variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  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|DragonFly)/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
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    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_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  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
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  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
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_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
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    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
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# 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]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_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 $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t@_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t@_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf 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
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # 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).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# 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).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # 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).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # 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).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp 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'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # 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.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # 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
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, 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 install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$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)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach  says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_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.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$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.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      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
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	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]].*|aix[[5-9]]*)
+	  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.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=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
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=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.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$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)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # 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.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=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*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$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'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$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'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='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'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=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.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) 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_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  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
+    ;;
+
+  aix[[4-9]]*)
+    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])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        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]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    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.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=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
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=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.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach  says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+	      '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    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
+        ;;
+      aix[[4-9]]*)
+	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])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    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
+        ;;
+      aix[[4-9]]*)
+	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])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
+
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# 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.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [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.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [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.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [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.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
+
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# 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.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
+
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# 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.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
+
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# 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.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
+
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# serial 1 (pkg-config-0.24)
+# 
+# Copyright © 2004 Scott James Remnant .
+#
+# 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.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=m4_default([$1], [0.9.0])
+	AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		AC_MSG_RESULT([yes])
+	else
+		AC_MSG_RESULT([no])
+		PKG_CONFIG=""
+	fi
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+# only at the first occurence in configure.ac, so if the first place
+# it's called might be skipped (such as if it is within an "if", you
+# have to call PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_default([$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+    pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+    PKG_CHECK_EXISTS([$3],
+                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes ],
+		     [pkg_failed=yes])
+ else
+    pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+   	AC_MSG_RESULT([no])
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+        else 
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+	m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+        ])
+elif test $pkg_failed = untried; then
+     	AC_MSG_RESULT([no])
+	m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see .])[]dnl
+        ])
+else
+	$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+	$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+	$3
+fi[]dnl
+])# PKG_CHECK_MODULES
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 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.
+
+# serial 1
+
+# 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.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.3], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.3])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005, 2011 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.
+
+# serial 1
+
+# 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.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2005
+# 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.
+
+# serial 4
+
+# This was merged into AC_PROG_CC in Autoconf.
+
+AU_DEFUN([AM_PROG_CC_STDC],
+[AC_PROG_CC
+AC_DIAGNOSE([obsolete], [$0:
+	your code should no longer depend upon `am_cv_prog_cc_stdc', but upon
+	`ac_cv_prog_cc_stdc'.  Remove this warning and the assignment when
+	you adjust the code.  You can also remove the above call to
+	AC_PROG_CC if you already called it elsewhere.])
+am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc
+])
+AU_DEFUN([fp_PROG_CC_STDC])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# 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.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+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])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 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.
+
+# serial 12
+
+# 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], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$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'.
+  rm -rf conftest.dir
+  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
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  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
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # 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.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # 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.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    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
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    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_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# 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.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  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.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  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 "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/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 (C) 1996, 1997, 2000, 2001, 2003, 2005
+# 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.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 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.
+
+# serial 16
+
+# 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.
+
+# 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_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# 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
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])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)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# 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
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_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
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# 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.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 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.
+
+# serial 1
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  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.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
+# 2011 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.
+
+# serial 5
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+[  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer],
+      [USE_MAINTAINER_MODE=$enableval],
+      [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST([MAINT])dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  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.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+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
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# 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.
+
+# serial 6
+
+# 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
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# 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
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 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.
+
+# serial 1
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 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.
+
+# serial 5
+
+# _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],
+[m4_foreach_w([_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])])
+
+# Copyright (C) 2001, 2003, 2005, 2011 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.
+
+# serial 1
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# 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.
+
+# serial 5
+
+# 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
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# 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)])
+
+# Copyright (C) 2001, 2003, 2005, 2011 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.
+
+# serial 1
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# 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="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008, 2010 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.
+
+# serial 3
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005, 2012 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.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+m4_if([$1], [v7],
+     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar /dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([acinclude.m4])
diff --git a/build/Makefile.am b/build/Makefile.am
new file mode 100644
index 0000000..e754ecb
--- /dev/null
+++ b/build/Makefile.am
@@ -0,0 +1,3 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = vs2008 vs2010
diff --git a/build/Makefile.in b/build/Makefile.in
new file mode 100644
index 0000000..ca0e763
--- /dev/null
+++ b/build/Makefile.in
@@ -0,0 +1,623 @@
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = build
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+API_VERSION = @API_VERSION@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DB2HTML = @DB2HTML@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOLT_BASH = @DOLT_BASH@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GACUTIL = @GACUTIL@
+GAPI_CODEGEN = @GAPI_CODEGEN@
+GAPI_FIXUP = @GAPI_FIXUP@
+GAPI_PARSER = @GAPI_PARSER@
+GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@
+GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@
+GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@
+GMIME_API_VERSION = @GMIME_API_VERSION@
+GMIME_BINARY_AGE = @GMIME_BINARY_AGE@
+GMIME_CFLAGS = @GMIME_CFLAGS@
+GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@
+GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@
+GMIME_LIBDIR = @GMIME_LIBDIR@
+GMIME_LIBS = @GMIME_LIBS@
+GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@
+GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@
+GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@
+GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@
+GMIME_VERSION = @GMIME_VERSION@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@
+GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTCOMPILE = @LTCOMPILE@
+LTCXXCOMPILE = @LTCXXCOMPILE@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MV = @MV@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+RM = @RM@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gacdir = @gacdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ms_librarian = @ms_librarian@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = vs2008 vs2010
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign build/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# 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):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	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; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	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; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$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_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        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:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic clean-libtool \
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-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/build/vs2008/Makefile.am b/build/vs2008/Makefile.am
new file mode 100644
index 0000000..176ed3b
--- /dev/null
+++ b/build/vs2008/Makefile.am
@@ -0,0 +1,18 @@
+## Process this file with automake to produce Makefile.in
+
+EXTRA_DIST = \
+	config-win32.h.in	\
+	config-win32.h		\
+	gmime.vcproj		\
+	uuencode.vcproj		\
+	uudecode.vcproj		\
+	gmime.sln		\
+	basic-example.vcproj	\
+	imap-example.vcproj	\
+	test-headers.vcproj	\
+	test-streams.vcproj	\
+	test-iconv.vcproj	\
+	test-mime.vcproj	\
+	test-mbox.vcproj	\
+	test-cat.vcproj		\
+	unistd.h
diff --git a/build/vs2008/Makefile.in b/build/vs2008/Makefile.in
new file mode 100644
index 0000000..2c133ac
--- /dev/null
+++ b/build/vs2008/Makefile.in
@@ -0,0 +1,440 @@
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = build/vs2008
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/config-win32.h.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = config-win32.h
+CONFIG_CLEAN_VPATH_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+API_VERSION = @API_VERSION@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DB2HTML = @DB2HTML@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOLT_BASH = @DOLT_BASH@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GACUTIL = @GACUTIL@
+GAPI_CODEGEN = @GAPI_CODEGEN@
+GAPI_FIXUP = @GAPI_FIXUP@
+GAPI_PARSER = @GAPI_PARSER@
+GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@
+GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@
+GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@
+GMIME_API_VERSION = @GMIME_API_VERSION@
+GMIME_BINARY_AGE = @GMIME_BINARY_AGE@
+GMIME_CFLAGS = @GMIME_CFLAGS@
+GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@
+GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@
+GMIME_LIBDIR = @GMIME_LIBDIR@
+GMIME_LIBS = @GMIME_LIBS@
+GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@
+GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@
+GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@
+GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@
+GMIME_VERSION = @GMIME_VERSION@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@
+GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTCOMPILE = @LTCOMPILE@
+LTCXXCOMPILE = @LTCXXCOMPILE@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MV = @MV@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+RM = @RM@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gacdir = @gacdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ms_librarian = @ms_librarian@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = \
+	config-win32.h.in	\
+	config-win32.h		\
+	gmime.vcproj		\
+	uuencode.vcproj		\
+	uudecode.vcproj		\
+	gmime.sln		\
+	basic-example.vcproj	\
+	imap-example.vcproj	\
+	test-headers.vcproj	\
+	test-streams.vcproj	\
+	test-iconv.vcproj	\
+	test-mime.vcproj	\
+	test-mbox.vcproj	\
+	test-cat.vcproj		\
+	unistd.h
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/vs2008/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign build/vs2008/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+config-win32.h: $(top_builddir)/config.status $(srcdir)/config-win32.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$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:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-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/build/vs2008/basic-example.vcproj b/build/vs2008/basic-example.vcproj
new file mode 100644
index 0000000..7d5c19f
--- /dev/null
+++ b/build/vs2008/basic-example.vcproj
@@ -0,0 +1,359 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+		
+		
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2008/config-win32.h b/build/vs2008/config-win32.h
new file mode 100644
index 0000000..14767cd
--- /dev/null
+++ b/build/vs2008/config-win32.h
@@ -0,0 +1,193 @@
+/* config.h.  Generated from config.h.in by configure.  */
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define if GMime should enable warning output. */
+/* #undef ENABLE_WARNINGS */
+
+/* Define to the GMime version */
+#define GMIME_VERSION "2.6.15"
+
+/* Define if libc defines an altzone variable */
+/* #undef HAVE_ALTZONE */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_DLFCN_H */
+
+/* Define to 1 if you have the `fsync' function. */
+/* #undef HAVE_FSYNC */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `getdomainname' function. */
+/* #undef HAVE_GETDOMAINNAME */
+
+/* Define to 1 if you have the `gethostname' function. */
+#define HAVE_GETHOSTNAME 1
+
+/* Define to 1 if you have the  header with the GNU `getopt_long'
+   function. */
+/* #undef HAVE_GETOPT_H */
+
+/* Define to 1 if you have the `getpagesize' function. */
+/* #undef HAVE_GETPAGESIZE */
+
+/* Define to 1 if you have the `gmtime_r' function. */
+/* #undef HAVE_GMTIME_R */
+
+/* Define to 1 if you have the `gmtime_s' function. */
+#define HAVE_GMTIME_S 1
+
+/* Define if you have the iconv() function and it works. */
+#define HAVE_ICONV 1
+
+/* Define to 1 to use auto-detected iconv-friendly charset names. */
+/* #undef HAVE_ICONV_DETECT_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_INTTYPES_H */
+
+/* Define to 1 if you have the `localtime' function. */
+#define HAVE_LOCALTIME 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+/* #undef HAVE_MMAP */
+
+/* Define to 1 if you have the `msync' function. */
+/* #undef HAVE_MSYNC */
+
+/* Define to 1 if you have the `munmap' function. */
+/* #undef HAVE_MUNMAP */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_NETDB_H */
+
+/* Define to 1 if you have the `poll' function. */
+/* #undef HAVE_POLL */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_POLL_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_REGEX_H */
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_STDINT_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strftime' function. */
+#define HAVE_STRFTIME 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_STRINGS_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_MMAN_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_PARAM_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if libc defines a timezone variable */
+/* #undef HAVE_TIMEZONE */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_TIME_H 1
+
+/* Define if struct tm has a tm_gmtoff member */
+/* #undef HAVE_TM_GMTOFF */
+
+/* Define if struct utsname has a domainname member */
+/* #undef HAVE_UTSNAME_DOMAINNAME */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_WINSOCK2_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_ZLIB_H 1
+
+/* Define if libc defines a _timezone variable */
+/* #undef HAVE__TIMEZONE */
+
+/* Define as const if the declaration of iconv() needs const. */
+#define ICONV_CONST 
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+/* #undef LT_OBJDIR */
+
+/* Define with a value if your  does not define MAXHOSTNAMELEN */
+/* #undef MAXHOSTNAMELEN */
+
+/* Define to 0 if your system does not have the O_LARGEFILE flag */
+/* #undef O_LARGEFILE */
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=gmime"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "gmime"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "gmime 2.6.15"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "gmime"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "2.6.15"
+
+/* The size of `off_t', as computed by sizeof. */
+#define SIZEOF_OFF_T 4
+
+/* The size of `size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T 4
+
+/* The size of `ssize_t', as computed by sizeof. */
+#define SIZEOF_SSIZE_T 4
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to `int' if  does not define. */
+#define mode_t int
+
+/* Define to `unsigned long int' if  does not define. */
+#define nfds_t unsigned long int
+
+/* Define to `long int' if  does not define. */
+/* #undef off_t */
+
+/* Define to `unsigned int' if  does not define. */
+/* #undef size_t */
+
+/* Define to `int' if  does not define. */
+#define ssize_t int
diff --git a/build/vs2008/config-win32.h.in b/build/vs2008/config-win32.h.in
new file mode 100644
index 0000000..1a6663e
--- /dev/null
+++ b/build/vs2008/config-win32.h.in
@@ -0,0 +1,193 @@
+/* config.h.  Generated from config.h.in by configure.  */
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define if GMime should enable warning output. */
+/* #undef ENABLE_WARNINGS */
+
+/* Define to the GMime version */
+#define GMIME_VERSION "@GMIME_VERSION@"
+
+/* Define if libc defines an altzone variable */
+/* #undef HAVE_ALTZONE */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_DLFCN_H */
+
+/* Define to 1 if you have the `fsync' function. */
+/* #undef HAVE_FSYNC */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `getdomainname' function. */
+/* #undef HAVE_GETDOMAINNAME */
+
+/* Define to 1 if you have the `gethostname' function. */
+#define HAVE_GETHOSTNAME 1
+
+/* Define to 1 if you have the  header with the GNU `getopt_long'
+   function. */
+/* #undef HAVE_GETOPT_H */
+
+/* Define to 1 if you have the `getpagesize' function. */
+/* #undef HAVE_GETPAGESIZE */
+
+/* Define to 1 if you have the `gmtime_r' function. */
+/* #undef HAVE_GMTIME_R */
+
+/* Define to 1 if you have the `gmtime_s' function. */
+#define HAVE_GMTIME_S 1
+
+/* Define if you have the iconv() function and it works. */
+#define HAVE_ICONV 1
+
+/* Define to 1 to use auto-detected iconv-friendly charset names. */
+/* #undef HAVE_ICONV_DETECT_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_INTTYPES_H */
+
+/* Define to 1 if you have the `localtime' function. */
+#define HAVE_LOCALTIME 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+/* #undef HAVE_MMAP */
+
+/* Define to 1 if you have the `msync' function. */
+/* #undef HAVE_MSYNC */
+
+/* Define to 1 if you have the `munmap' function. */
+/* #undef HAVE_MUNMAP */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_NETDB_H */
+
+/* Define to 1 if you have the `poll' function. */
+/* #undef HAVE_POLL */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_POLL_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_REGEX_H */
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_STDINT_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strftime' function. */
+#define HAVE_STRFTIME 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_STRINGS_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_MMAN_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_PARAM_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if libc defines a timezone variable */
+/* #undef HAVE_TIMEZONE */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_TIME_H 1
+
+/* Define if struct tm has a tm_gmtoff member */
+/* #undef HAVE_TM_GMTOFF */
+
+/* Define if struct utsname has a domainname member */
+/* #undef HAVE_UTSNAME_DOMAINNAME */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_WINSOCK2_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_ZLIB_H 1
+
+/* Define if libc defines a _timezone variable */
+/* #undef HAVE__TIMEZONE */
+
+/* Define as const if the declaration of iconv() needs const. */
+#define ICONV_CONST 
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+/* #undef LT_OBJDIR */
+
+/* Define with a value if your  does not define MAXHOSTNAMELEN */
+/* #undef MAXHOSTNAMELEN */
+
+/* Define to 0 if your system does not have the O_LARGEFILE flag */
+/* #undef O_LARGEFILE */
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=gmime"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "gmime"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "gmime @GMIME_VERSION@"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "gmime"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "@GMIME_VERSION@"
+
+/* The size of `off_t', as computed by sizeof. */
+#define SIZEOF_OFF_T 4
+
+/* The size of `size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T 4
+
+/* The size of `ssize_t', as computed by sizeof. */
+#define SIZEOF_SSIZE_T 4
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to `int' if  does not define. */
+#define mode_t int
+
+/* Define to `unsigned long int' if  does not define. */
+#define nfds_t unsigned long int
+
+/* Define to `long int' if  does not define. */
+/* #undef off_t */
+
+/* Define to `unsigned int' if  does not define. */
+/* #undef size_t */
+
+/* Define to `int' if  does not define. */
+#define ssize_t int
diff --git a/build/vs2008/gmime.sln b/build/vs2008/gmime.sln
new file mode 100644
index 0000000..0beaaf5
--- /dev/null
+++ b/build/vs2008/gmime.sln
@@ -0,0 +1,169 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gmime", "gmime.vcproj", "{F281AAC0-61AB-4E5C-849D-34FDB3687675}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-mime", "test-mime.vcproj", "{73E5564C-D771-4A6C-8051-5E4B332657E0}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-mbox", "test-mbox.vcproj", "{B73E0CCB-865F-425A-B2B0-7CDA7800225C}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-iconv", "test-iconv.vcproj", "{E6414E36-0022-4795-8EF8-001B4BAE8A13}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-streams", "test-streams.vcproj", "{42063A3C-FABA-476E-BB53-F7852DB18FA6}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-headers", "test-headers.vcproj", "{E337362A-067C-4F60-9C13-AAE59523007E}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-cat", "test-cat.vcproj", "{0304DFB4-9E94-4944-BCAD-72B9C4071911}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-example", "basic-example.vcproj", "{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "imap-example", "imap-example.vcproj", "{4222517E-7B56-44B7-A7BD-A1E07AF214B8}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uuencode", "uuencode.vcproj", "{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uudecode", "uudecode.vcproj", "{D076BFF6-F838-4D2B-9E61-D9C755140D62}"
+	ProjectSection(ProjectDependencies) = postProject
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Library", "Library", "{3B1C4EEC-FBA0-42C3-9CD6-D9C83E85D696}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{E24CFB28-5139-4DE9-A04E-4F73DB011C9A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Unit Tests", "Unit Tests", "{A47944AA-7603-4D8A-9655-31E2039E2DC4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{3018E99C-4367-48D0-BE63-65903E020B0D}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Debug|Win32.ActiveCfg = Debug|Win32
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Debug|Win32.Build.0 = Debug|Win32
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Debug|x64.ActiveCfg = Debug|x64
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Debug|x64.Build.0 = Debug|x64
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Release|Win32.ActiveCfg = Release|Win32
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Release|Win32.Build.0 = Release|Win32
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Release|x64.ActiveCfg = Release|x64
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Release|x64.Build.0 = Release|x64
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Debug|Win32.ActiveCfg = Debug|Win32
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Debug|Win32.Build.0 = Debug|Win32
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Debug|x64.ActiveCfg = Debug|x64
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Debug|x64.Build.0 = Debug|x64
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Release|Win32.ActiveCfg = Release|Win32
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Release|x64.ActiveCfg = Release|x64
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Release|x64.Build.0 = Release|x64
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Debug|Win32.ActiveCfg = Debug|Win32
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Debug|Win32.Build.0 = Debug|Win32
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Debug|x64.ActiveCfg = Debug|x64
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Debug|x64.Build.0 = Debug|x64
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Release|Win32.ActiveCfg = Release|Win32
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Release|x64.ActiveCfg = Release|x64
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Release|x64.Build.0 = Release|x64
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Debug|Win32.ActiveCfg = Debug|Win32
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Debug|Win32.Build.0 = Debug|Win32
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Debug|x64.ActiveCfg = Debug|x64
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Debug|x64.Build.0 = Debug|x64
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Release|Win32.ActiveCfg = Release|Win32
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Release|x64.ActiveCfg = Release|x64
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Release|x64.Build.0 = Release|x64
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Debug|Win32.ActiveCfg = Debug|Win32
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Debug|Win32.Build.0 = Debug|Win32
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Debug|x64.ActiveCfg = Debug|x64
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Debug|x64.Build.0 = Debug|x64
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Release|Win32.ActiveCfg = Release|Win32
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Release|x64.ActiveCfg = Release|x64
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Release|x64.Build.0 = Release|x64
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Debug|Win32.ActiveCfg = Debug|Win32
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Debug|Win32.Build.0 = Debug|Win32
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Debug|x64.ActiveCfg = Debug|x64
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Debug|x64.Build.0 = Debug|x64
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Release|Win32.ActiveCfg = Release|Win32
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Release|x64.ActiveCfg = Release|x64
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Release|x64.Build.0 = Release|x64
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Debug|Win32.ActiveCfg = Debug|Win32
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Debug|Win32.Build.0 = Debug|Win32
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Debug|x64.ActiveCfg = Debug|x64
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Debug|x64.Build.0 = Debug|x64
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Release|Win32.ActiveCfg = Release|Win32
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Release|x64.ActiveCfg = Release|x64
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Release|x64.Build.0 = Release|x64
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Debug|Win32.ActiveCfg = Debug|Win32
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Debug|Win32.Build.0 = Debug|Win32
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Debug|x64.ActiveCfg = Debug|x64
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Debug|x64.Build.0 = Debug|x64
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Release|Win32.ActiveCfg = Release|Win32
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Release|x64.ActiveCfg = Release|x64
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Release|x64.Build.0 = Release|x64
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Debug|Win32.ActiveCfg = Debug|Win32
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Debug|Win32.Build.0 = Debug|Win32
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Debug|x64.ActiveCfg = Debug|x64
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Debug|x64.Build.0 = Debug|x64
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Release|Win32.ActiveCfg = Release|Win32
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Release|x64.ActiveCfg = Release|x64
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Release|x64.Build.0 = Release|x64
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Debug|Win32.ActiveCfg = Debug|Win32
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Debug|Win32.Build.0 = Debug|Win32
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Debug|x64.ActiveCfg = Debug|x64
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Debug|x64.Build.0 = Debug|x64
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Release|Win32.ActiveCfg = Release|Win32
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Release|Win32.Build.0 = Release|Win32
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Release|x64.ActiveCfg = Release|x64
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Release|x64.Build.0 = Release|x64
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Debug|Win32.ActiveCfg = Debug|Win32
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Debug|Win32.Build.0 = Debug|Win32
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Debug|x64.ActiveCfg = Debug|x64
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Debug|x64.Build.0 = Debug|x64
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Release|Win32.ActiveCfg = Release|Win32
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Release|Win32.Build.0 = Release|Win32
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Release|x64.ActiveCfg = Release|x64
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Release|x64.Build.0 = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {3B1C4EEC-FBA0-42C3-9CD6-D9C83E85D696}
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0} = {E24CFB28-5139-4DE9-A04E-4F73DB011C9A}
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8} = {E24CFB28-5139-4DE9-A04E-4F73DB011C9A}
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{E337362A-067C-4F60-9C13-AAE59523007E} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{73E5564C-D771-4A6C-8051-5E4B332657E0} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62} = {3018E99C-4367-48D0-BE63-65903E020B0D}
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9} = {3018E99C-4367-48D0-BE63-65903E020B0D}
+	EndGlobalSection
+EndGlobal
diff --git a/build/vs2008/gmime.vcproj b/build/vs2008/gmime.vcproj
new file mode 100644
index 0000000..2214292
--- /dev/null
+++ b/build/vs2008/gmime.vcproj
@@ -0,0 +1,807 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2008/imap-example.vcproj b/build/vs2008/imap-example.vcproj
new file mode 100644
index 0000000..830f923
--- /dev/null
+++ b/build/vs2008/imap-example.vcproj
@@ -0,0 +1,359 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+		
+		
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2008/test-cat.vcproj b/build/vs2008/test-cat.vcproj
new file mode 100644
index 0000000..aa4bcc6
--- /dev/null
+++ b/build/vs2008/test-cat.vcproj
@@ -0,0 +1,367 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+		
+		
+			
+			
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2008/test-headers.vcproj b/build/vs2008/test-headers.vcproj
new file mode 100644
index 0000000..0c0b3a1
--- /dev/null
+++ b/build/vs2008/test-headers.vcproj
@@ -0,0 +1,367 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+		
+		
+			
+			
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2008/test-iconv.vcproj b/build/vs2008/test-iconv.vcproj
new file mode 100644
index 0000000..2f2496c
--- /dev/null
+++ b/build/vs2008/test-iconv.vcproj
@@ -0,0 +1,367 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+		
+		
+			
+			
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2008/test-mbox.vcproj b/build/vs2008/test-mbox.vcproj
new file mode 100644
index 0000000..3c0e698
--- /dev/null
+++ b/build/vs2008/test-mbox.vcproj
@@ -0,0 +1,367 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+		
+		
+			
+			
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2008/test-mime.vcproj b/build/vs2008/test-mime.vcproj
new file mode 100644
index 0000000..299ffd0
--- /dev/null
+++ b/build/vs2008/test-mime.vcproj
@@ -0,0 +1,367 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+		
+		
+			
+			
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2008/test-streams.vcproj b/build/vs2008/test-streams.vcproj
new file mode 100644
index 0000000..2d7e867
--- /dev/null
+++ b/build/vs2008/test-streams.vcproj
@@ -0,0 +1,367 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+		
+		
+			
+			
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2008/unistd.h b/build/vs2008/unistd.h
new file mode 100644
index 0000000..2b7d1ac
--- /dev/null
+++ b/build/vs2008/unistd.h
@@ -0,0 +1,21 @@
+/**
+ * unistd.h: Emulation of some standard UNIX APIs
+ **/
+
+#include 
+#include 
+
+/* Map the Windows equivalents to the POSIX function names */
+#define open(path,flags,mode) _open(path,flags,mode)
+#define close(fd) _close(fd)
+#define read(fd,buf,n) _read(fd,buf,n)
+#define write(fd,buf,n) _write(fd,buf,n)
+#define lseek(fd,offset,whence) _lseek(fd,offset,whence)
+#define fdopen(fd,mode) _fdopen(fd,mode)
+#define unlink(path) _unlink(path)
+#define dup(fd) _dup(fd)
+#define getpid() _getpid()
+
+/* Implement some useful sys/stat.h macros that Windows doesn't seem to have */
+#define S_ISDIR(mode) ((mode) & _S_IFDIR)
+#define S_ISREG(mode) ((mode) & _S_IFREG)
diff --git a/build/vs2008/uudecode.vcproj b/build/vs2008/uudecode.vcproj
new file mode 100644
index 0000000..4bdbf9c
--- /dev/null
+++ b/build/vs2008/uudecode.vcproj
@@ -0,0 +1,375 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2008/uuencode.vcproj b/build/vs2008/uuencode.vcproj
new file mode 100644
index 0000000..ee24cdd
--- /dev/null
+++ b/build/vs2008/uuencode.vcproj
@@ -0,0 +1,375 @@
+
+
+	
+		
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+			
+		
+	
+	
+	
+	
+		
+			
+			
+			
+			
+			
+			
+		
+		
+			
+			
+		
+		
+		
+	
+	
+	
+
diff --git a/build/vs2010/Makefile.am b/build/vs2010/Makefile.am
new file mode 100644
index 0000000..839a00b
--- /dev/null
+++ b/build/vs2010/Makefile.am
@@ -0,0 +1,18 @@
+## Process this file with automake to produce Makefile.in
+
+EXTRA_DIST = \
+	config-win32.h.in	\
+	config-win32.h		\
+	gmime.vcxproj		\
+	uuencode.vcxproj	\
+	uudecode.vcxproj	\
+	gmime.sln		\
+	basic-example.vcxproj	\
+	imap-example.vcxproj	\
+	test-headers.vcxproj	\
+	test-streams.vcxproj	\
+	test-iconv.vcxproj	\
+	test-mime.vcxproj	\
+	test-mbox.vcxproj	\
+	test-cat.vcxproj	\
+	unistd.h
diff --git a/build/vs2010/Makefile.in b/build/vs2010/Makefile.in
new file mode 100644
index 0000000..1ce878a
--- /dev/null
+++ b/build/vs2010/Makefile.in
@@ -0,0 +1,440 @@
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = build/vs2010
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(srcdir)/config-win32.h.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = config-win32.h
+CONFIG_CLEAN_VPATH_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+API_VERSION = @API_VERSION@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DB2HTML = @DB2HTML@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOLT_BASH = @DOLT_BASH@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GACUTIL = @GACUTIL@
+GAPI_CODEGEN = @GAPI_CODEGEN@
+GAPI_FIXUP = @GAPI_FIXUP@
+GAPI_PARSER = @GAPI_PARSER@
+GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@
+GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@
+GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@
+GMIME_API_VERSION = @GMIME_API_VERSION@
+GMIME_BINARY_AGE = @GMIME_BINARY_AGE@
+GMIME_CFLAGS = @GMIME_CFLAGS@
+GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@
+GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@
+GMIME_LIBDIR = @GMIME_LIBDIR@
+GMIME_LIBS = @GMIME_LIBS@
+GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@
+GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@
+GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@
+GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@
+GMIME_VERSION = @GMIME_VERSION@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@
+GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTCOMPILE = @LTCOMPILE@
+LTCXXCOMPILE = @LTCXXCOMPILE@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MV = @MV@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+RM = @RM@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gacdir = @gacdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ms_librarian = @ms_librarian@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = \
+	config-win32.h.in	\
+	config-win32.h		\
+	gmime.vcxproj		\
+	uuencode.vcxproj	\
+	uudecode.vcxproj	\
+	gmime.sln		\
+	basic-example.vcxproj	\
+	imap-example.vcxproj	\
+	test-headers.vcxproj	\
+	test-streams.vcxproj	\
+	test-iconv.vcxproj	\
+	test-mime.vcxproj	\
+	test-mbox.vcxproj	\
+	test-cat.vcxproj	\
+	unistd.h
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign build/vs2010/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign build/vs2010/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+config-win32.h: $(top_builddir)/config.status $(srcdir)/config-win32.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$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:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-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/build/vs2010/basic-example.vcxproj b/build/vs2010/basic-example.vcxproj
new file mode 100644
index 0000000..4a1d72c
--- /dev/null
+++ b/build/vs2010/basic-example.vcxproj
@@ -0,0 +1,206 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}
+    basicexample
+    Win32Proj
+  
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\basic-example\
+    true
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\basic-example\
+    true
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\basic-example\
+    false
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\basic-example\
+    false
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX64
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX64
+    
+  
+  
+    
+  
+  
+    
+      {f281aac0-61ab-4e5c-849d-34fdb3687675}
+      false
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/build/vs2010/config-win32.h b/build/vs2010/config-win32.h
new file mode 100644
index 0000000..14767cd
--- /dev/null
+++ b/build/vs2010/config-win32.h
@@ -0,0 +1,193 @@
+/* config.h.  Generated from config.h.in by configure.  */
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define if GMime should enable warning output. */
+/* #undef ENABLE_WARNINGS */
+
+/* Define to the GMime version */
+#define GMIME_VERSION "2.6.15"
+
+/* Define if libc defines an altzone variable */
+/* #undef HAVE_ALTZONE */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_DLFCN_H */
+
+/* Define to 1 if you have the `fsync' function. */
+/* #undef HAVE_FSYNC */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `getdomainname' function. */
+/* #undef HAVE_GETDOMAINNAME */
+
+/* Define to 1 if you have the `gethostname' function. */
+#define HAVE_GETHOSTNAME 1
+
+/* Define to 1 if you have the  header with the GNU `getopt_long'
+   function. */
+/* #undef HAVE_GETOPT_H */
+
+/* Define to 1 if you have the `getpagesize' function. */
+/* #undef HAVE_GETPAGESIZE */
+
+/* Define to 1 if you have the `gmtime_r' function. */
+/* #undef HAVE_GMTIME_R */
+
+/* Define to 1 if you have the `gmtime_s' function. */
+#define HAVE_GMTIME_S 1
+
+/* Define if you have the iconv() function and it works. */
+#define HAVE_ICONV 1
+
+/* Define to 1 to use auto-detected iconv-friendly charset names. */
+/* #undef HAVE_ICONV_DETECT_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_INTTYPES_H */
+
+/* Define to 1 if you have the `localtime' function. */
+#define HAVE_LOCALTIME 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+/* #undef HAVE_MMAP */
+
+/* Define to 1 if you have the `msync' function. */
+/* #undef HAVE_MSYNC */
+
+/* Define to 1 if you have the `munmap' function. */
+/* #undef HAVE_MUNMAP */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_NETDB_H */
+
+/* Define to 1 if you have the `poll' function. */
+/* #undef HAVE_POLL */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_POLL_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_REGEX_H */
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_STDINT_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strftime' function. */
+#define HAVE_STRFTIME 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_STRINGS_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_MMAN_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_PARAM_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if libc defines a timezone variable */
+/* #undef HAVE_TIMEZONE */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_TIME_H 1
+
+/* Define if struct tm has a tm_gmtoff member */
+/* #undef HAVE_TM_GMTOFF */
+
+/* Define if struct utsname has a domainname member */
+/* #undef HAVE_UTSNAME_DOMAINNAME */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_WINSOCK2_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_ZLIB_H 1
+
+/* Define if libc defines a _timezone variable */
+/* #undef HAVE__TIMEZONE */
+
+/* Define as const if the declaration of iconv() needs const. */
+#define ICONV_CONST 
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+/* #undef LT_OBJDIR */
+
+/* Define with a value if your  does not define MAXHOSTNAMELEN */
+/* #undef MAXHOSTNAMELEN */
+
+/* Define to 0 if your system does not have the O_LARGEFILE flag */
+/* #undef O_LARGEFILE */
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=gmime"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "gmime"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "gmime 2.6.15"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "gmime"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "2.6.15"
+
+/* The size of `off_t', as computed by sizeof. */
+#define SIZEOF_OFF_T 4
+
+/* The size of `size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T 4
+
+/* The size of `ssize_t', as computed by sizeof. */
+#define SIZEOF_SSIZE_T 4
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to `int' if  does not define. */
+#define mode_t int
+
+/* Define to `unsigned long int' if  does not define. */
+#define nfds_t unsigned long int
+
+/* Define to `long int' if  does not define. */
+/* #undef off_t */
+
+/* Define to `unsigned int' if  does not define. */
+/* #undef size_t */
+
+/* Define to `int' if  does not define. */
+#define ssize_t int
diff --git a/build/vs2010/config-win32.h.in b/build/vs2010/config-win32.h.in
new file mode 100644
index 0000000..1a6663e
--- /dev/null
+++ b/build/vs2010/config-win32.h.in
@@ -0,0 +1,193 @@
+/* config.h.  Generated from config.h.in by configure.  */
+/* config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define if GMime should enable warning output. */
+/* #undef ENABLE_WARNINGS */
+
+/* Define to the GMime version */
+#define GMIME_VERSION "@GMIME_VERSION@"
+
+/* Define if libc defines an altzone variable */
+/* #undef HAVE_ALTZONE */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_DLFCN_H */
+
+/* Define to 1 if you have the `fsync' function. */
+/* #undef HAVE_FSYNC */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#define HAVE_GETADDRINFO 1
+
+/* Define to 1 if you have the `getdomainname' function. */
+/* #undef HAVE_GETDOMAINNAME */
+
+/* Define to 1 if you have the `gethostname' function. */
+#define HAVE_GETHOSTNAME 1
+
+/* Define to 1 if you have the  header with the GNU `getopt_long'
+   function. */
+/* #undef HAVE_GETOPT_H */
+
+/* Define to 1 if you have the `getpagesize' function. */
+/* #undef HAVE_GETPAGESIZE */
+
+/* Define to 1 if you have the `gmtime_r' function. */
+/* #undef HAVE_GMTIME_R */
+
+/* Define to 1 if you have the `gmtime_s' function. */
+#define HAVE_GMTIME_S 1
+
+/* Define if you have the iconv() function and it works. */
+#define HAVE_ICONV 1
+
+/* Define to 1 to use auto-detected iconv-friendly charset names. */
+/* #undef HAVE_ICONV_DETECT_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_INTTYPES_H */
+
+/* Define to 1 if you have the `localtime' function. */
+#define HAVE_LOCALTIME 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have a working `mmap' system call. */
+/* #undef HAVE_MMAP */
+
+/* Define to 1 if you have the `msync' function. */
+/* #undef HAVE_MSYNC */
+
+/* Define to 1 if you have the `munmap' function. */
+/* #undef HAVE_MUNMAP */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_NETDB_H */
+
+/* Define to 1 if you have the `poll' function. */
+/* #undef HAVE_POLL */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_POLL_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_REGEX_H */
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_STDINT_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strftime' function. */
+#define HAVE_STRFTIME 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_STRINGS_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_MMAN_H */
+
+/* Define to 1 if you have the  header file. */
+/* #undef HAVE_SYS_PARAM_H */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if libc defines a timezone variable */
+/* #undef HAVE_TIMEZONE */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_TIME_H 1
+
+/* Define if struct tm has a tm_gmtoff member */
+/* #undef HAVE_TM_GMTOFF */
+
+/* Define if struct utsname has a domainname member */
+/* #undef HAVE_UTSNAME_DOMAINNAME */
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_WINSOCK2_H 1
+
+/* Define to 1 if you have the  header file. */
+#define HAVE_ZLIB_H 1
+
+/* Define if libc defines a _timezone variable */
+/* #undef HAVE__TIMEZONE */
+
+/* Define as const if the declaration of iconv() needs const. */
+#define ICONV_CONST 
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+/* #undef LT_OBJDIR */
+
+/* Define with a value if your  does not define MAXHOSTNAMELEN */
+/* #undef MAXHOSTNAMELEN */
+
+/* Define to 0 if your system does not have the O_LARGEFILE flag */
+/* #undef O_LARGEFILE */
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "http://bugzilla.gnome.org/enter_bug.cgi?product=gmime"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "gmime"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "gmime @GMIME_VERSION@"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "gmime"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "@GMIME_VERSION@"
+
+/* The size of `off_t', as computed by sizeof. */
+#define SIZEOF_OFF_T 4
+
+/* The size of `size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T 4
+
+/* The size of `ssize_t', as computed by sizeof. */
+#define SIZEOF_SSIZE_T 4
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to `int' if  does not define. */
+#define mode_t int
+
+/* Define to `unsigned long int' if  does not define. */
+#define nfds_t unsigned long int
+
+/* Define to `long int' if  does not define. */
+/* #undef off_t */
+
+/* Define to `unsigned int' if  does not define. */
+/* #undef size_t */
+
+/* Define to `int' if  does not define. */
+#define ssize_t int
diff --git a/build/vs2010/gmime.sln b/build/vs2010/gmime.sln
new file mode 100644
index 0000000..98e9ccd
--- /dev/null
+++ b/build/vs2010/gmime.sln
@@ -0,0 +1,139 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Library", "Library", "{3B1C4EEC-FBA0-42C3-9CD6-D9C83E85D696}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{E24CFB28-5139-4DE9-A04E-4F73DB011C9A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Unit Tests", "Unit Tests", "{A47944AA-7603-4D8A-9655-31E2039E2DC4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{3018E99C-4367-48D0-BE63-65903E020B0D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gmime", "gmime.vcxproj", "{F281AAC0-61AB-4E5C-849D-34FDB3687675}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-mime", "test-mime.vcxproj", "{73E5564C-D771-4A6C-8051-5E4B332657E0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-mbox", "test-mbox.vcxproj", "{B73E0CCB-865F-425A-B2B0-7CDA7800225C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-iconv", "test-iconv.vcxproj", "{E6414E36-0022-4795-8EF8-001B4BAE8A13}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-streams", "test-streams.vcxproj", "{42063A3C-FABA-476E-BB53-F7852DB18FA6}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-headers", "test-headers.vcxproj", "{E337362A-067C-4F60-9C13-AAE59523007E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test-cat", "test-cat.vcxproj", "{0304DFB4-9E94-4944-BCAD-72B9C4071911}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-example", "basic-example.vcxproj", "{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "imap-example", "imap-example.vcxproj", "{4222517E-7B56-44B7-A7BD-A1E07AF214B8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uuencode", "uuencode.vcxproj", "{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uudecode", "uudecode.vcxproj", "{D076BFF6-F838-4D2B-9E61-D9C755140D62}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Debug|Win32.ActiveCfg = Debug|Win32
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Debug|Win32.Build.0 = Debug|Win32
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Debug|x64.ActiveCfg = Debug|x64
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Debug|x64.Build.0 = Debug|x64
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Release|Win32.ActiveCfg = Release|Win32
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Release|Win32.Build.0 = Release|Win32
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Release|x64.ActiveCfg = Release|x64
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675}.Release|x64.Build.0 = Release|x64
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Debug|Win32.ActiveCfg = Debug|Win32
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Debug|Win32.Build.0 = Debug|Win32
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Debug|x64.ActiveCfg = Debug|x64
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Debug|x64.Build.0 = Debug|x64
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Release|Win32.ActiveCfg = Release|Win32
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Release|x64.ActiveCfg = Release|x64
+		{73E5564C-D771-4A6C-8051-5E4B332657E0}.Release|x64.Build.0 = Release|x64
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Debug|Win32.ActiveCfg = Debug|Win32
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Debug|Win32.Build.0 = Debug|Win32
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Debug|x64.ActiveCfg = Debug|x64
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Debug|x64.Build.0 = Debug|x64
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Release|Win32.ActiveCfg = Release|Win32
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Release|x64.ActiveCfg = Release|x64
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C}.Release|x64.Build.0 = Release|x64
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Debug|Win32.ActiveCfg = Debug|Win32
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Debug|Win32.Build.0 = Debug|Win32
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Debug|x64.ActiveCfg = Debug|x64
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Debug|x64.Build.0 = Debug|x64
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Release|Win32.ActiveCfg = Release|Win32
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Release|x64.ActiveCfg = Release|x64
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13}.Release|x64.Build.0 = Release|x64
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Debug|Win32.ActiveCfg = Debug|Win32
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Debug|Win32.Build.0 = Debug|Win32
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Debug|x64.ActiveCfg = Debug|x64
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Debug|x64.Build.0 = Debug|x64
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Release|Win32.ActiveCfg = Release|Win32
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Release|x64.ActiveCfg = Release|x64
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6}.Release|x64.Build.0 = Release|x64
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Debug|Win32.ActiveCfg = Debug|Win32
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Debug|Win32.Build.0 = Debug|Win32
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Debug|x64.ActiveCfg = Debug|x64
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Debug|x64.Build.0 = Debug|x64
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Release|Win32.ActiveCfg = Release|Win32
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Release|x64.ActiveCfg = Release|x64
+		{E337362A-067C-4F60-9C13-AAE59523007E}.Release|x64.Build.0 = Release|x64
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Debug|Win32.ActiveCfg = Debug|Win32
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Debug|Win32.Build.0 = Debug|Win32
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Debug|x64.ActiveCfg = Debug|x64
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Debug|x64.Build.0 = Debug|x64
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Release|Win32.ActiveCfg = Release|Win32
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Release|x64.ActiveCfg = Release|x64
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911}.Release|x64.Build.0 = Release|x64
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Debug|Win32.ActiveCfg = Debug|Win32
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Debug|Win32.Build.0 = Debug|Win32
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Debug|x64.ActiveCfg = Debug|x64
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Debug|x64.Build.0 = Debug|x64
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Release|Win32.ActiveCfg = Release|Win32
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Release|x64.ActiveCfg = Release|x64
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0}.Release|x64.Build.0 = Release|x64
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Debug|Win32.ActiveCfg = Debug|Win32
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Debug|Win32.Build.0 = Debug|Win32
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Debug|x64.ActiveCfg = Debug|x64
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Debug|x64.Build.0 = Debug|x64
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Release|Win32.ActiveCfg = Release|Win32
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Release|x64.ActiveCfg = Release|x64
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8}.Release|x64.Build.0 = Release|x64
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Debug|Win32.ActiveCfg = Debug|Win32
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Debug|Win32.Build.0 = Debug|Win32
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Debug|x64.ActiveCfg = Debug|x64
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Debug|x64.Build.0 = Debug|x64
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Release|Win32.ActiveCfg = Release|Win32
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Release|Win32.Build.0 = Release|Win32
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Release|x64.ActiveCfg = Release|x64
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}.Release|x64.Build.0 = Release|x64
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Debug|Win32.ActiveCfg = Debug|Win32
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Debug|Win32.Build.0 = Debug|Win32
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Debug|x64.ActiveCfg = Debug|x64
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Debug|x64.Build.0 = Debug|x64
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Release|Win32.ActiveCfg = Release|Win32
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Release|Win32.Build.0 = Release|Win32
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Release|x64.ActiveCfg = Release|x64
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62}.Release|x64.Build.0 = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{F281AAC0-61AB-4E5C-849D-34FDB3687675} = {3B1C4EEC-FBA0-42C3-9CD6-D9C83E85D696}
+		{BA7336F6-9CAC-4669-AE7F-A9E998E6A0D0} = {E24CFB28-5139-4DE9-A04E-4F73DB011C9A}
+		{4222517E-7B56-44B7-A7BD-A1E07AF214B8} = {E24CFB28-5139-4DE9-A04E-4F73DB011C9A}
+		{73E5564C-D771-4A6C-8051-5E4B332657E0} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{B73E0CCB-865F-425A-B2B0-7CDA7800225C} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{E6414E36-0022-4795-8EF8-001B4BAE8A13} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{42063A3C-FABA-476E-BB53-F7852DB18FA6} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{E337362A-067C-4F60-9C13-AAE59523007E} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{0304DFB4-9E94-4944-BCAD-72B9C4071911} = {A47944AA-7603-4D8A-9655-31E2039E2DC4}
+		{9C2C07C2-AC9F-405E-87B4-8DAFA92708F9} = {3018E99C-4367-48D0-BE63-65903E020B0D}
+		{D076BFF6-F838-4D2B-9E61-D9C755140D62} = {3018E99C-4367-48D0-BE63-65903E020B0D}
+	EndGlobalSection
+EndGlobal
diff --git a/build/vs2010/gmime.vcxproj b/build/vs2010/gmime.vcxproj
new file mode 100644
index 0000000..5dc578b
--- /dev/null
+++ b/build/vs2010/gmime.vcxproj
@@ -0,0 +1,331 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {F281AAC0-61AB-4E5C-849D-34FDB3687675}
+    gmime
+    Win32Proj
+  
+  
+  
+    StaticLibrary
+  
+  
+    StaticLibrary
+  
+  
+    StaticLibrary
+  
+  
+    StaticLibrary
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\gmime\
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\gmime\
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\gmime\
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\gmime\
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      Generating config.h ...
+      if exist ..\..\config.h goto DONE_CONFIG_H
+copy config-win32.h ..\..\config.h
+:DONE_CONFIG_H
+if exist ..\..\unistd.h goto DONE_UNISTD_H
+copy unistd.h ..\..\unistd.h
+:DONE_UNISTD_H
+
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;GMIME_EXPORTS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      
+      
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      $(OutDir)$(ProjectName)-2.6.lib
+    
+  
+  
+    
+      Generating config.h ...
+      if exist ..\..\config.h goto DONE_CONFIG_H
+copy config-win32.h ..\..\config.h
+:DONE_CONFIG_H
+if exist ..\..\unistd.h goto DONE_UNISTD_H
+copy unistd.h ..\..\unistd.h
+:DONE_UNISTD_H
+
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;GMIME_EXPORTS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      
+      
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      $(OutDir)$(ProjectName)-2.6.lib
+    
+  
+  
+    
+      Generating config.h ...
+      if exist ..\..\config.h goto DONE_CONFIG_H
+copy config-win32.h ..\..\config.h
+:DONE_CONFIG_H
+if exist ..\..\unistd.h goto DONE_UNISTD_H
+copy unistd.h ..\..\unistd.h
+:DONE_UNISTD_H
+
+    
+    
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;GMIME_EXPORTS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      
+      
+      MultiThreadedDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      $(OutDir)$(ProjectName)-2.6.lib
+    
+  
+  
+    
+      Generating config.h ...
+      if exist ..\..\config.h goto DONE_CONFIG_H
+copy config-win32.h ..\..\config.h
+:DONE_CONFIG_H
+if exist ..\..\unistd.h goto DONE_UNISTD_H
+copy unistd.h ..\..\unistd.h
+:DONE_UNISTD_H
+
+    
+    
+      X64
+    
+    
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;GMIME_EXPORTS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      
+      
+      MultiThreadedDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      $(OutDir)$(ProjectName)-2.6.lib
+    
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+  
+  
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/build/vs2010/imap-example.vcxproj b/build/vs2010/imap-example.vcxproj
new file mode 100644
index 0000000..fbe8c5f
--- /dev/null
+++ b/build/vs2010/imap-example.vcxproj
@@ -0,0 +1,206 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {4222517E-7B56-44B7-A7BD-A1E07AF214B8}
+    imapexample
+    Win32Proj
+  
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\imap-example\
+    true
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\imap-example\
+    true
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\imap-example\
+    false
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\imap-example\
+    false
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX64
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX64
+    
+  
+  
+    
+  
+  
+    
+      {f281aac0-61ab-4e5c-849d-34fdb3687675}
+      false
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/build/vs2010/test-cat.vcxproj b/build/vs2010/test-cat.vcxproj
new file mode 100644
index 0000000..1be2c64
--- /dev/null
+++ b/build/vs2010/test-cat.vcxproj
@@ -0,0 +1,210 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {0304DFB4-9E94-4944-BCAD-72B9C4071911}
+    testcat
+    Win32Proj
+  
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-cat\
+    true
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-cat\
+    true
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-cat\
+    false
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-cat\
+    false
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX64
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX64
+    
+  
+  
+    
+    
+  
+  
+    
+  
+  
+    
+      {f281aac0-61ab-4e5c-849d-34fdb3687675}
+      false
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/build/vs2010/test-headers.vcxproj b/build/vs2010/test-headers.vcxproj
new file mode 100644
index 0000000..d7994ed
--- /dev/null
+++ b/build/vs2010/test-headers.vcxproj
@@ -0,0 +1,210 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {E337362A-067C-4F60-9C13-AAE59523007E}
+    testheaders
+    Win32Proj
+  
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-headers\
+    true
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-headers\
+    true
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-headers\
+    false
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-headers\
+    false
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX64
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX64
+    
+  
+  
+    
+    
+  
+  
+    
+  
+  
+    
+      {f281aac0-61ab-4e5c-849d-34fdb3687675}
+      false
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/build/vs2010/test-iconv.vcxproj b/build/vs2010/test-iconv.vcxproj
new file mode 100644
index 0000000..f307bec
--- /dev/null
+++ b/build/vs2010/test-iconv.vcxproj
@@ -0,0 +1,210 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {E6414E36-0022-4795-8EF8-001B4BAE8A13}
+    testiconv
+    Win32Proj
+  
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-iconv\
+    true
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-iconv\
+    true
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-iconv\
+    false
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-iconv\
+    false
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX64
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX64
+    
+  
+  
+    
+    
+  
+  
+    
+  
+  
+    
+      {f281aac0-61ab-4e5c-849d-34fdb3687675}
+      false
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/build/vs2010/test-mbox.vcxproj b/build/vs2010/test-mbox.vcxproj
new file mode 100644
index 0000000..d84c71d
--- /dev/null
+++ b/build/vs2010/test-mbox.vcxproj
@@ -0,0 +1,210 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {B73E0CCB-865F-425A-B2B0-7CDA7800225C}
+    testmbox
+    Win32Proj
+  
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-mbox\
+    true
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-mbox\
+    true
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-mbox\
+    false
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-mbox\
+    false
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX64
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX64
+    
+  
+  
+    
+    
+  
+  
+    
+  
+  
+    
+      {f281aac0-61ab-4e5c-849d-34fdb3687675}
+      false
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/build/vs2010/test-mime.vcxproj b/build/vs2010/test-mime.vcxproj
new file mode 100644
index 0000000..3c2b37e
--- /dev/null
+++ b/build/vs2010/test-mime.vcxproj
@@ -0,0 +1,210 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {73E5564C-D771-4A6C-8051-5E4B332657E0}
+    testmime
+    Win32Proj
+  
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-mime\
+    true
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-mime\
+    true
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-mime\
+    false
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-mime\
+    false
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX64
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX64
+    
+  
+  
+    
+    
+  
+  
+    
+  
+  
+    
+      {f281aac0-61ab-4e5c-849d-34fdb3687675}
+      false
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/build/vs2010/test-streams.vcxproj b/build/vs2010/test-streams.vcxproj
new file mode 100644
index 0000000..cfcae44
--- /dev/null
+++ b/build/vs2010/test-streams.vcxproj
@@ -0,0 +1,210 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {42063A3C-FABA-476E-BB53-F7852DB18FA6}
+    teststreams
+    Win32Proj
+  
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-streams\
+    true
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-streams\
+    true
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\test-streams\
+    false
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\test-streams\
+    false
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX64
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      true
+      true
+      MachineX64
+    
+  
+  
+    
+    
+  
+  
+    
+  
+  
+    
+      {f281aac0-61ab-4e5c-849d-34fdb3687675}
+      false
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/build/vs2010/unistd.h b/build/vs2010/unistd.h
new file mode 100644
index 0000000..2b7d1ac
--- /dev/null
+++ b/build/vs2010/unistd.h
@@ -0,0 +1,21 @@
+/**
+ * unistd.h: Emulation of some standard UNIX APIs
+ **/
+
+#include 
+#include 
+
+/* Map the Windows equivalents to the POSIX function names */
+#define open(path,flags,mode) _open(path,flags,mode)
+#define close(fd) _close(fd)
+#define read(fd,buf,n) _read(fd,buf,n)
+#define write(fd,buf,n) _write(fd,buf,n)
+#define lseek(fd,offset,whence) _lseek(fd,offset,whence)
+#define fdopen(fd,mode) _fdopen(fd,mode)
+#define unlink(path) _unlink(path)
+#define dup(fd) _dup(fd)
+#define getpid() _getpid()
+
+/* Implement some useful sys/stat.h macros that Windows doesn't seem to have */
+#define S_ISDIR(mode) ((mode) & _S_IFDIR)
+#define S_ISREG(mode) ((mode) & _S_IFREG)
diff --git a/build/vs2010/uudecode.vcxproj b/build/vs2010/uudecode.vcxproj
new file mode 100644
index 0000000..9391387
--- /dev/null
+++ b/build/vs2010/uudecode.vcxproj
@@ -0,0 +1,215 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {D076BFF6-F838-4D2B-9E61-D9C755140D62}
+    uudecode
+    Win32Proj
+  
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\uudecode\
+    true
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\uudecode\
+    true
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\uudecode\
+    false
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\uudecode\
+    false
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      %(DelayLoadDLLs)
+      true
+      Console
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      %(DelayLoadDLLs)
+      true
+      Console
+      MachineX64
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      %(DelayLoadDLLs)
+      true
+      Console
+      true
+      true
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      %(DelayLoadDLLs)
+      true
+      Console
+      true
+      true
+      MachineX64
+    
+  
+  
+    
+    
+    
+  
+  
+    
+  
+  
+    
+      {f281aac0-61ab-4e5c-849d-34fdb3687675}
+      false
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/build/vs2010/uuencode.vcxproj b/build/vs2010/uuencode.vcxproj
new file mode 100644
index 0000000..d287d81
--- /dev/null
+++ b/build/vs2010/uuencode.vcxproj
@@ -0,0 +1,217 @@
+
+
+  
+    
+      Debug
+      Win32
+    
+    
+      Debug
+      x64
+    
+    
+      Release
+      Win32
+    
+    
+      Release
+      x64
+    
+  
+  
+    {9C2C07C2-AC9F-405E-87B4-8DAFA92708F9}
+    uuencode
+    Win32Proj
+  
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+    Application
+    Unicode
+    true
+  
+  
+    Application
+    Unicode
+  
+  
+  
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+    
+  
+  
+  
+    <_ProjectFileVersion>10.0.30319.1
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\uuencode\
+    true
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\uuencode\
+    true
+    $(SolutionDir)$(Configuration)\
+    $(Configuration)\uuencode\
+    false
+    $(SolutionDir)$(Platform)\$(Configuration)\
+    $(Platform)\$(Configuration)\uuencode\
+    false
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+    AllRules.ruleset
+    
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      EditAndContinue
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      Disabled
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      true
+      EnableFastChecks
+      MultiThreadedDebugDLL
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      true
+      Console
+      MachineX64
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      true
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      %(AdditionalLibraryDirectories)
+      %(DelayLoadDLLs)
+      false
+      Console
+      true
+      true
+      MachineX86
+    
+  
+  
+    
+      $(IntDir)BuildLog.htm
+    
+    
+      X64
+    
+    
+      MaxSpeed
+      true
+      ..\..\; ..\..\util;%(AdditionalIncludeDirectories)
+      WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;HAVE_CONFIG_H;G_DISABLE_DEPRECATED;G_LOG_DOMAIN="GMime";%(PreprocessorDefinitions)
+      MultiThreadedDLL
+      true
+      
+      
+      Level3
+      ProgramDatabase
+      CompileAsC
+    
+    
+      ws2_32.lib;libiconv.lib;glib-2.0.lib;gobject-2.0.lib;gio-2.0.lib;zdll.lib;%(AdditionalDependencies)
+      libiconv.dll;glib-2.0.dll;gobject-2.0.dll;gio-2.0.dll;gmime-2.6.dll;zlib.dll;%(DelayLoadDLLs)
+      true
+      Console
+      true
+      true
+      MachineX64
+    
+  
+  
+    
+    
+    
+  
+  
+    
+  
+  
+    
+      {f281aac0-61ab-4e5c-849d-34fdb3687675}
+      false
+    
+  
+  
+  
+  
+
\ No newline at end of file
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..d622a44
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1530 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# 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, see .
+#
+# 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.  Please send patches (context
+# diff format) to  and include a 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.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+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 ."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+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 ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # 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 "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { 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 ; set_cc_for_build= ;'
+
+# 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 tuples: *-*-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 ;;
+	    sh5el) machine=sh5le-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 -q __ELF__
+		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 ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# 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 Pn.n version is a patched version.
+	# 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/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    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 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    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 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    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 ;;
+    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 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    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 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # 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 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include   /* 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 &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    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 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????: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 ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    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 ;;
+    *: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 
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	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 ;;
+    *:AIX:*:[4567])
+	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 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    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 
+		#include 
+
+		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
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include 
+	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 && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    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 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    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 ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
+    i*:windows32*:*)
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    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 ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    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 -q ld.so.1
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	LIBC=gnu
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#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; }
+	;;
+    or32:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    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 ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    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 ;;
+    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 ;;
+    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 ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    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 ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	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 ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' /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 ;;
+    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 i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    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 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*: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 | SHG2:*:4.0:3.0 | S7501*:*: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; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	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; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *: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 ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says 
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes .
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    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 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    i386)
+		eval $set_cc_for_build
+		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		      grep IS_64BIT_ARCH >/dev/null
+		  then
+		      UNAME_PROCESSOR="x86_64"
+		  fi
+		fi ;;
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *: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 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *: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 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
+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 <
+# include 
+#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 
+  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\n"); 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 
+#  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 && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# 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 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 < 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 100644
index 0000000..b2afad9
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,213 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if cryptography in GMime is enabled. */
+#undef ENABLE_CRYPTOGRAPHY
+
+/* Define if GMime should enable experimental S/MIME support. */
+#undef ENABLE_SMIME
+
+/* Define if GMime should enable warning output. */
+#undef ENABLE_WARNINGS
+
+/* Define to the GMime version */
+#undef GMIME_VERSION
+
+/* Define if libc defines an altzone variable */
+#undef HAVE_ALTZONE
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the `fsync' function. */
+#undef HAVE_FSYNC
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#undef HAVE_GETADDRINFO
+
+/* Define to 1 if you have the `getdomainname' function. */
+#undef HAVE_GETDOMAINNAME
+
+/* Define to 1 if you have the `gethostname' function. */
+#undef HAVE_GETHOSTNAME
+
+/* Define to 1 if you have the  header with the GNU `getopt_long'
+   function. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#undef HAVE_GMTIME_R
+
+/* Define to 1 if you have the `gmtime_s' function. */
+#undef HAVE_GMTIME_S
+
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define to 1 to use auto-detected iconv-friendly charset names. */
+#undef HAVE_ICONV_DETECT_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `localtime' function. */
+#undef HAVE_LOCALTIME
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define to 1 if you have the `msync' function. */
+#undef HAVE_MSYNC
+
+/* Define to 1 if you have the `munmap' function. */
+#undef HAVE_MUNMAP
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the `poll' function. */
+#undef HAVE_POLL
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_POLL_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_REGEX_H
+
+/* Define to 1 if you have the `select' function. */
+#undef HAVE_SELECT
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strftime' function. */
+#undef HAVE_STRFTIME
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define if libc defines a timezone variable */
+#undef HAVE_TIMEZONE
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_TIME_H
+
+/* Define if struct tm has a tm_gmtoff member */
+#undef HAVE_TM_GMTOFF
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if struct utsname has a domainname member */
+#undef HAVE_UTSNAME_DOMAINNAME
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_WINSOCK2_H
+
+/* Define to 1 if you have the  header file. */
+#undef HAVE_ZLIB_H
+
+/* Define if libc defines a _timezone variable */
+#undef HAVE__TIMEZONE
+
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Define with a value if your  does not define MAXHOSTNAMELEN */
+#undef MAXHOSTNAMELEN
+
+/* Define to 0 if your system does not have the O_LARGEFILE flag */
+#undef O_LARGEFILE
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of `off_t', as computed by sizeof. */
+#undef SIZEOF_OFF_T
+
+/* The size of `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* The size of `ssize_t', as computed by sizeof. */
+#undef SIZEOF_SSIZE_T
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define if GMime should enable stricter parsing rules. */
+#undef STRICT_PARSER
+
+/* Version number of package */
+#undef VERSION
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to `int' if  does not define. */
+#undef mode_t
+
+/* Define to `unsigned long int' if  does not define. */
+#undef nfds_t
+
+/* Define to `long int' if  does not define. */
+#undef off_t
+
+/* Define to `unsigned int' if  does not define. */
+#undef size_t
+
+/* Define to `int' if  does not define. */
+#undef ssize_t
diff --git a/config.rpath b/config.rpath
new file mode 100644
index 0000000..e69de29
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..c894da4
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1773 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# 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, see .
+#
+# 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 .  Submit a context
+# diff and a properly formatted GNU 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.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# 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 ."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+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 ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # 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 ;;
+
+    * )
+       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* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    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 | -knuth | -cray | -microblaze)
+		os=
+		basic_machine=$1
+		;;
+	-bluegene*)
+		os=-cnk
+		;;
+	-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
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-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/'`
+		;;
+	-sco5v6*)
+		# 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 \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+        | be32 | be64 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| epiphany \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| open8 \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pyramid \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| we32k \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# 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-* \
+	| aarch64-* | aarch64_be-* \
+	| 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-* | avr32-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pyramid-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# 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
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	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
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	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
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	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
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	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
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	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*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
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	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
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i386-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	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
+		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	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
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-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-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc | ppcbe)	basic_machine=powerpc-unknown
+		;;
+	ppc-* | ppcbe-*)
+		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
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	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
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	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
+		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	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
+		;;
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	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
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-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
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	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
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		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.
+	-auroraux)
+		os=-auroraux
+		;;
+	-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* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-uclibc* \
+	      | -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* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	# 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* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-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
+		;;
+	-os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-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
+		;;
+	-tpf*)
+		os=-tpf
+		;;
+	-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
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-nacl*)
+		;;
+	-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
+	score-*)
+		os=-elf
+		;;
+	spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# 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
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mep-*)
+		os=-elf
+		;;
+	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
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-knuth)
+		os=-mmixware
+		;;
+	*-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
+				;;
+			-cnk*|-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
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-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
+
+# 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/configure b/configure
new file mode 100755
index 0000000..03d218b
--- /dev/null
+++ b/configure
@@ -0,0 +1,21779 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for gmime 2.6.15.
+#
+# Report bugs to .
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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 more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+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
+IFS=$as_save_IFS
+
+     ;;
+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
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: http://bugzilla.gnome.org/enter_bug.cgi?product=gmime
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; 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
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# 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
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_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 sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval 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="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 &1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='gmime'
+PACKAGE_TARNAME='gmime'
+PACKAGE_VERSION='2.6.15'
+PACKAGE_STRING='gmime 2.6.15'
+PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=gmime'
+PACKAGE_URL=''
+
+ac_unique_file="README"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include 
+#ifdef HAVE_SYS_TYPES_H
+# include 
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include 
+#endif
+#ifdef STDC_HEADERS
+# include 
+# include 
+#else
+# ifdef HAVE_STDLIB_H
+#  include 
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include 
+# endif
+# include 
+#endif
+#ifdef HAVE_STRINGS_H
+# include 
+#endif
+#ifdef HAVE_INTTYPES_H
+# include 
+#endif
+#ifdef HAVE_STDINT_H
+# include 
+#endif
+#ifdef HAVE_UNISTD_H
+# include 
+#endif"
+
+ac_header_list=
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+GMIME_LIBS
+GMIME_CFLAGS
+GMIME_LIBS_PRIVATE
+GMIME_INCLUDEDIR
+GMIME_LIBDIR
+gacdir
+API_VERSION
+GAPI_PARSER
+GAPI_FIXUP
+GAPI_CODEGEN
+GAPI_TOOLS_LIBS
+GAPI_TOOLS_CFLAGS
+GLIB_SHARP_LIBS
+GLIB_SHARP_CFLAGS
+GACUTIL
+ENABLE_MONO_FALSE
+ENABLE_MONO_TRUE
+CSC
+GPGME_PTHREAD_LIBS
+GPGME_PTHREAD_CFLAGS
+GPGME_CONFIG
+ENABLE_LARGEFILE_FALSE
+ENABLE_LARGEFILE_TRUE
+SYSTEM_GETOPT_FALSE
+SYSTEM_GETOPT_TRUE
+LTLIBICONV
+LIBICONV
+GLIB_COMPILE_RESOURCES
+GLIB_MKENUMS
+GOBJECT_QUERY
+GLIB_GENMARSHAL
+GLIB_LIBS
+GLIB_CFLAGS
+ENABLE_CRYPTOGRAPHY_FALSE
+ENABLE_CRYPTOGRAPHY_TRUE
+HAVE_DOCBOOK_FALSE
+HAVE_DOCBOOK_TRUE
+DB2HTML
+GTK_DOC_USE_REBASE_FALSE
+GTK_DOC_USE_REBASE_TRUE
+GTK_DOC_USE_LIBTOOL_FALSE
+GTK_DOC_USE_LIBTOOL_TRUE
+GTK_DOC_BUILD_PDF_FALSE
+GTK_DOC_BUILD_PDF_TRUE
+GTK_DOC_BUILD_HTML_FALSE
+GTK_DOC_BUILD_HTML_TRUE
+ENABLE_GTK_DOC_FALSE
+ENABLE_GTK_DOC_TRUE
+GTKDOC_DEPS_LIBS
+GTKDOC_DEPS_CFLAGS
+HTML_DIR
+GTKDOC_MKPDF
+GTKDOC_REBASE
+GTKDOC_CHECK
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
+LTCXXCOMPILE
+LTCOMPILE
+DOLT_BASH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+SED
+LIBTOOL
+TAR
+MV
+RM
+LN_S
+EGREP
+GREP
+CPP
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+MS_LIB_AVAILABLE_FALSE
+MS_LIB_AVAILABLE_TRUE
+ms_librarian
+RANLIB
+NM
+WINDRES
+OS_WIN32_X64_FALSE
+OS_WIN32_X64_TRUE
+OS_WIN32_FALSE
+OS_WIN32_TRUE
+PLATFORM_WIN32_FALSE
+PLATFORM_WIN32_TRUE
+LIB_EXE_MACHINE_FLAG
+LT_CURRENT_MINUS_AGE
+LT_AGE
+LT_REVISION
+LT_CURRENT
+LT_RELEASE
+GMIME_BINARY_AGE
+GMIME_INTERFACE_AGE
+GMIME_VERSION
+GMIME_API_VERSION
+GMIME_MICRO_VERSION
+GMIME_MINOR_VERSION
+GMIME_MAJOR_VERSION
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+ACLOCAL_AMFLAGS
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_maintainer_mode
+enable_dependency_tracking
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+with_html_dir
+enable_gtk_doc
+enable_gtk_doc_html
+enable_gtk_doc_pdf
+enable_profiling
+enable_warnings
+enable_strict_parser
+enable_cryptography
+enable_glibtest
+enable_rpath
+with_libiconv_prefix
+enable_largefile
+enable_smime
+with_gpgme_prefix
+enable_mono
+with_gacdir
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+GTKDOC_DEPS_CFLAGS
+GTKDOC_DEPS_LIBS
+GLIB_SHARP_CFLAGS
+GLIB_SHARP_LIBS
+GAPI_TOOLS_CFLAGS
+GAPI_TOOLS_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# 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.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+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
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -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)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$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 ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$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 ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    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 ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$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_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=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 ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_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'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+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
+    $as_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
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# 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 the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    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
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# 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 gmime 2.6.15 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 \`..']
+
+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]
+  --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]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/gmime]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_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]
+  --target=TARGET   configure for building compilers for TARGET [HOST]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of gmime 2.6.15:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+			  (and sometimes confusing) to the casual installer
+  --disable-dependency-tracking  speeds up one-time build
+  --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-gtk-doc        use gtk-doc to build documentation [[default=no]]
+  --enable-gtk-doc-html   build documentation in html format [[default=yes]]
+  --enable-gtk-doc-pdf    build documentation in pdf format [[default=no]]
+  --enable-profiling      enable profiling compile flags [[default=no]]
+  --enable-warnings       enable g_warning output when invalid MIME is
+                          encountered [[default=no]]
+  --enable-strict-parser  enable stricter MIME parser rules [[default=no]]
+  --enable-cryptography   enable cryptography support [[default=yes]]
+  --disable-glibtest      do not try to compile and run a test GLIB program
+  --disable-rpath         do not hardcode runtime library paths
+  --enable-largefile      enable support for large files [[default=yes]]
+  --disable-largefile     omit support for large files
+  --enable-smime          enable S/MIME support [[default=no]]
+  --enable-mono           enable Mono bindings [[default=auto]]
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot=DIR Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).
+  --with-html-dir=PATH    path to installed docs
+  --with-gnu-ld           assume the C compiler uses GNU ld default=no
+  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
+  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
+  --with-gpgme-prefix=PFX prefix where GPGME is installed (optional)
+  --with-gacdir           Specify the Global Assembly Cache root directory
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L if you have libraries in a
+              nonstandard directory 
+  LIBS        libraries to pass to the linker, e.g. -l
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I if
+              you have headers in a nonstandard directory 
+  CPP         C preprocessor
+  PKG_CONFIG  path to pkg-config utility
+  PKG_CONFIG_PATH
+              directories to add to pkg-config's search path
+  PKG_CONFIG_LIBDIR
+              path overriding pkg-config's built-in search path
+  GTKDOC_DEPS_CFLAGS
+              C compiler flags for GTKDOC_DEPS, overriding pkg-config
+  GTKDOC_DEPS_LIBS
+              linker flags for GTKDOC_DEPS, overriding pkg-config
+  GLIB_SHARP_CFLAGS
+              C compiler flags for GLIB_SHARP, overriding pkg-config
+  GLIB_SHARP_LIBS
+              linker flags for GLIB_SHARP, overriding pkg-config
+  GAPI_TOOLS_CFLAGS
+              C compiler flags for GAPI_TOOLS, overriding pkg-config
+  GAPI_TOOLS_LIBS
+              linker flags for GAPI_TOOLS, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to .
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested 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
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+gmime configure 2.6.15
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 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
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case  declares $2.
+   For example, HP-UX 11i  declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer  to  if __STDC__ is defined, since
+     exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include 
+#else
+# include 
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* 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_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## -------------------------------------------------------------------- ##
+## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=gmime ##
+## -------------------------------------------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include 
+#include 
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gmime $as_me 2.6.15, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+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`
+/usr/bin/hostinfo      = `(/usr/bin/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=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&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.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# 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: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > 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
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  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.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+as_fn_append ac_header_list " stdlib.h"
+as_fn_append ac_header_list " unistd.h"
+as_fn_append ac_header_list " sys/param.h"
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; 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,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_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
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_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.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+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
+
+
+
+
+
+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
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if ${ac_cv_target+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$target_alias" = x; then
+  ac_cv_target=$ac_cv_host
+else
+  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+
+
+
+# Save this value here, since automake will set cflags later
+cflags_set=${CFLAGS+set}
+
+am__api_version='1.11'
+
+# 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"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&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/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+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.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$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'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# 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".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "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 $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# 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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gmime'
+ VERSION='2.6.15'
+
+
+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"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5
+$as_echo_n "checking how to create a ustar tar archive... " >&6; }
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar plaintar pax cpio none'
+_am_tools=${am_cv_prog_tar_ustar-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      { echo "$as_me:$LINENO: $_am_tar --version" >&5
+   ($_am_tar --version) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } && break
+    done
+    am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x ustar -w "$$tardir"'
+    am__tar_='pax -L -x ustar -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H ustar -L'
+    am__tar_='find "$tardir" -print | cpio -o -H ustar -L'
+    am__untar='cpio -i -H ustar -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_ustar}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5
+   (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    { echo "$as_me:$LINENO: $am__untar &5
+   ($am__untar &5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+if ${am_cv_prog_tar_ustar+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  am_cv_prog_tar_ustar=$_am_tool
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5
+$as_echo "$am_cv_prog_tar_ustar" >&6; }
+
+
+
+
+
+ACLOCAL_AMFLAGS="-I m4 \${ACLOCAL_FLAGS}"
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-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
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$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
+
+
+
+
+GMIME_MAJOR_VERSION=2
+GMIME_MINOR_VERSION=6
+GMIME_MICRO_VERSION=15
+GMIME_INTERFACE_AGE=15
+GMIME_BINARY_AGE=615
+GMIME_API_VERSION=2.6
+GMIME_VERSION=2.6.15
+
+
+
+
+
+
+
+
+
+
+$as_echo "#define GMIME_VERSION \"2.6.15\"" >>confdefs.h
+
+
+# libtool versioning
+LT_RELEASE=2.6
+LT_CURRENT=600
+LT_REVISION=15
+LT_AGE=600
+LT_CURRENT_MINUS_AGE=0
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if building for Win32" >&5
+$as_echo_n "checking if building for Win32... " >&6; }
+LIB_EXE_MACHINE_FLAG=X86
+case "$host" in
+  *-*-mingw*)
+    platform_win32="yes"
+    native_win32="yes"
+    case "$host" in
+    x86_64-*-*)
+      LIB_EXE_MACHINE_FLAG=X64
+      ;;
+    esac
+    ;;
+  *)
+    platform_win32="no"
+    native_win32="no"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $platform_win32" >&5
+$as_echo "$platform_win32" >&6; }
+
+
+
+ if test "x$platform_win32" = "xyes"; then
+  PLATFORM_WIN32_TRUE=
+  PLATFORM_WIN32_FALSE='#'
+else
+  PLATFORM_WIN32_TRUE='#'
+  PLATFORM_WIN32_FALSE=
+fi
+
+ if test "$native_win32" = "xyes"; then
+  OS_WIN32_TRUE=
+  OS_WIN32_FALSE='#'
+else
+  OS_WIN32_TRUE='#'
+  OS_WIN32_FALSE=
+fi
+
+ if test "$LIB_EXE_MACHINE_FLAG" = "X64"; then
+  OS_WIN32_X64_TRUE=
+  OS_WIN32_X64_FALSE='#'
+else
+  OS_WIN32_X64_TRUE='#'
+  OS_WIN32_X64_FALSE=
+fi
+
+
+if test "$glib_native_win32" = "yes"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
+set dummy ${ac_tool_prefix}windres; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_WINDRES+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$WINDRES"; then
+  ac_cv_prog_WINDRES="$WINDRES" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_WINDRES="${ac_tool_prefix}windres"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+WINDRES=$ac_cv_prog_WINDRES
+if test -n "$WINDRES"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5
+$as_echo "$WINDRES" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_WINDRES"; then
+  ac_ct_WINDRES=$WINDRES
+  # Extract the first word of "windres", so it can be a program name with args.
+set dummy windres; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_WINDRES+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_WINDRES"; then
+  ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_WINDRES="windres"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES
+if test -n "$ac_ct_WINDRES"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5
+$as_echo "$ac_ct_WINDRES" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_WINDRES" = x; then
+    WINDRES="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    WINDRES=$ac_ct_WINDRES
+  fi
+else
+  WINDRES="$ac_cv_prog_WINDRES"
+fi
+
+  if test "$WINDRES" = no; then
+    as_fn_error $? "*** Could not find an implementation of windres in your PATH." "$LINENO" 5
+  fi
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nm; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  ac_cv_prog_NM="$NM" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_NM="${ac_tool_prefix}nm"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NM=$ac_cv_prog_NM
+if test -n "$NM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NM" >&5
+$as_echo "$NM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NM"; then
+  ac_ct_NM=$NM
+  # Extract the first word of "nm", so it can be a program name with args.
+set dummy nm; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NM"; then
+  ac_cv_prog_ac_ct_NM="$ac_ct_NM" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_NM="nm"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NM=$ac_cv_prog_ac_ct_NM
+if test -n "$ac_ct_NM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NM" >&5
+$as_echo "$ac_ct_NM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NM" = x; then
+    NM="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NM=$ac_ct_NM
+  fi
+else
+  NM="$ac_cv_prog_NM"
+fi
+
+  if test "$NM" = no; then
+    as_fn_error $? "*** Could not find an implementation of nm in your PATH." "$LINENO" 5
+  fi
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+  # Extract the first word of "lib.exe", so it can be a program name with args.
+set dummy lib.exe; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ms_librarian+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ms_librarian"; then
+  ac_cv_prog_ms_librarian="$ms_librarian" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ms_librarian="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_ms_librarian" && ac_cv_prog_ms_librarian="no"
+fi
+fi
+ms_librarian=$ac_cv_prog_ms_librarian
+if test -n "$ms_librarian"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ms_librarian" >&5
+$as_echo "$ms_librarian" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+ if test x$ms_librarian = xyes; then
+  MS_LIB_AVAILABLE_TRUE=
+  MS_LIB_AVAILABLE_FALSE='#'
+else
+  MS_LIB_AVAILABLE_TRUE='#'
+  MS_LIB_AVAILABLE_FALSE=
+fi
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-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='\'
+  am__nodep='_no'
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# 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.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; 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 conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+#include 
+#include 
+/* 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;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+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;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+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="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&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'.
+  rm -rf conftest.dir
+  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
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  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
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # 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.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # 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.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    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
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5
+$as_echo_n "checking for library containing strerror... " >&6; }
+if ${ac_cv_search_strerror+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char strerror ();
+int
+main ()
+{
+return strerror ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' cposix; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_strerror=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_strerror+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_strerror+:} false; then :
+
+else
+  ac_cv_search_strerror=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5
+$as_echo "$ac_cv_search_strerror" >&6; }
+ac_res=$ac_cv_search_strerror
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+#include 
+#include 
+/* 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;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+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;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+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="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&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'.
+  rm -rf conftest.dir
+  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
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  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
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # 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.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # 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.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    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
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+#include 
+#include 
+/* 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;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+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;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+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="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&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'.
+  rm -rf conftest.dir
+  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
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  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
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # 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.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # 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.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    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
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&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.
+  # Prefer  to  if __STDC__ is defined, since
+  #  exists even on freestanding compilers.
+  # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include 
+#else
+# include 
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i 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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$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.
+  # Prefer  to  if __STDC__ is defined, since
+  #  exists even on freestanding compilers.
+  # 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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include 
+#else
+# include 
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+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
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+#include 
+#include 
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+
+_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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+
+_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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+#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))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# Extract the first word of "rm", so it can be a program name with args.
+set dummy rm; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_RM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $RM in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_RM="$RM" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_RM" && ac_cv_path_RM="/bin/rm"
+  ;;
+esac
+fi
+RM=$ac_cv_path_RM
+if test -n "$RM"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5
+$as_echo "$RM" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "mv", so it can be a program name with args.
+set dummy mv; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MV+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MV in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_MV="$MV" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_MV="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_MV" && ac_cv_path_MV="/bin/mv"
+  ;;
+esac
+fi
+MV=$ac_cv_path_MV
+if test -n "$MV"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MV" >&5
+$as_echo "$MV" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "tar", so it can be a program name with args.
+set dummy tar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_TAR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $TAR in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_TAR="$TAR" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_TAR="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_TAR" && ac_cv_path_TAR="/bin/tar"
+  ;;
+esac
+fi
+TAR=$ac_cv_path_TAR
+if test -n "$TAR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TAR" >&5
+$as_echo "$TAR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.2'
+macro_revision='1.3337'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+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'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  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_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-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.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&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.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname 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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    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 variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 &5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 &5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_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
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    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
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&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 extended 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
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  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*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  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|DragonFly)/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
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    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_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  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
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  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
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&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]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$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=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && 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 $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_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 -rf 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
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+# Check whether --enable-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
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      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
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    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"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err 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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$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
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+# 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=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-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.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-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.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-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.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+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
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    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 <<_LT_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
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    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 <<_LT_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
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+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
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # 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_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # 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).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # 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_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && 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
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && 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
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_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
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # 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 extended regexp 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_|_GLOBAL__F[ID]_.*'
+  # 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.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # 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
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, 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 install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            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
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach  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* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      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 $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_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.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    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
+      ;;
+
+    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 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $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" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    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 "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      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
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	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].*|aix[5-9]*)
+	  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.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  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'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	link_all_deplibs=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), 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'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${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 $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            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
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # 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.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''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'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=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* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	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'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      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
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	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 $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  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 $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      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" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      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} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${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='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  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'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      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)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  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
+	;;
+      esac
+      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'
+      ;;
+
+    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*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  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.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$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=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+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"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    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.so
+      # instead of lib.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    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}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    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=`func_echo_all "$lib" | $SED '\''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'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$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"
+  # 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* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # 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
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  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.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      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}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # 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
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # 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'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_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}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$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 # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  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
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  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"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$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}${shared_ext}$versuffix ${libname}${shared_ext}$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.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=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
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+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 "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent 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 "$_LT_TAGVAR(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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; 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
+
+
+
+
+
+
+  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
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+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"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&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 <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include 
+#endif
+
+#include 
+
+#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
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 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;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 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_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&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 <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include 
+#endif
+
+#include 
+
+#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
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 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;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 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_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&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"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&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
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&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
+
+CC="$lt_save_CC"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+: ${CONFIG_LT=./config.lt}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_LT" >&5
+$as_echo "$as_me: creating $CONFIG_LT" >&6;}
+as_write_fail=0
+cat >"$CONFIG_LT" <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>"$CONFIG_LT" <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+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
+IFS=$as_save_IFS
+
+     ;;
+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
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; 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
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# 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
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval 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="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## --------------------------------- ##
+## Main body of "$CONFIG_LT" script. ##
+## --------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x "$CONFIG_LT"
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $0 [OPTIONS]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to ."
+
+lt_cl_version="\
+gmime config.lt 2.6.15
+configured by $0, generated by GNU Autoconf 2.68.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $# != 0
+do
+  case $1 in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) as_fn_error $? "unrecognized option: $1
+Try \`$0 --help' for more information." "$LINENO" 5 ;;
+
+    *) as_fn_error $? "unrecognized argument: $1
+Try \`$0 --help' for more information." "$LINENO" 5 ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec 6>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5
+$as_echo "$as_me: creating $ofile" >&6;}
+
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=""
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# 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
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# 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
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# 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
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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
+
+# 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
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# 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
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# 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 a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# 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\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# 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
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# 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
+
+# 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
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# 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
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # 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" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+as_fn_exit 0
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec 5>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec 5>>config.log
+$lt_cl_success || as_fn_exit 1
+
+
+
+# dolt, a replacement for libtool
+# Josh Triplett 
+# Extract the first word of "bash", so it can be a program name with args.
+set dummy bash; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_DOLT_BASH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $DOLT_BASH in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_DOLT_BASH="$DOLT_BASH" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_DOLT_BASH="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+DOLT_BASH=$ac_cv_path_DOLT_BASH
+if test -n "$DOLT_BASH"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOLT_BASH" >&5
+$as_echo "$DOLT_BASH" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if dolt supports this host" >&5
+$as_echo_n "checking if dolt supports this host... " >&6; }
+dolt_supported=yes
+if test x$DOLT_BASH = x; then
+    dolt_supported=no
+fi
+if test x$GCC != xyes; then
+    dolt_supported=no
+fi
+case $host in
+i?86-*-linux*|x86_64-*-linux*|powerpc-*-linux* \
+|amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*)
+    pic_options='-fPIC'
+    ;;
+i?86-apple-darwin*)
+    pic_options='-fno-common'
+    ;;
+*)
+    dolt_supported=no
+    ;;
+esac
+if test x$dolt_supported = xno ; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, falling back to libtool" >&5
+$as_echo "no, falling back to libtool" >&6; }
+    LTCOMPILE='$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(COMPILE)'
+    LTCXXCOMPILE='$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXXCOMPILE)'
+else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, replacing libtool" >&5
+$as_echo "yes, replacing libtool" >&6; }
+
+    cat <<__DOLTCOMPILE__EOF__ >doltcompile
+#!$DOLT_BASH
+__DOLTCOMPILE__EOF__
+    cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+args=("$@")
+for ((arg=0; arg<${#args[@]}; arg++)) ; do
+    if test x"${args[$arg]}" = x-o ; then
+        objarg=$((arg+1))
+        break
+    fi
+done
+if test x$objarg = x ; then
+    echo 'Error: no -o on compiler command line' 1>&2
+    exit 1
+fi
+lo="${args[$objarg]}"
+obj="${lo%.lo}"
+if test x"$lo" = x"$obj" ; then
+    echo "Error: libtool object file name \"$lo\" does not end in .lo" 1>&2
+    exit 1
+fi
+objbase="${obj##*/}"
+__DOLTCOMPILE__EOF__
+
+    if test x$enable_shared = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+libobjdir="${obj%$objbase}.libs"
+if test ! -d "$libobjdir" ; then
+    mkdir_out="$(mkdir "$libobjdir" 2>&1)"
+    mkdir_ret=$?
+    if test "$mkdir_ret" -ne 0 && test ! -d "$libobjdir" ; then
+	echo "$mkdir_out" 1>&2
+        exit $mkdir_ret
+    fi
+fi
+pic_object="$libobjdir/$objbase.o"
+args[$objarg]="$pic_object"
+__DOLTCOMPILE__EOF__
+    cat <<__DOLTCOMPILE__EOF__ >>doltcompile
+"\${args[@]}" $pic_options -DPIC || exit \$?
+__DOLTCOMPILE__EOF__
+    fi
+
+    if test x$enable_static = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+non_pic_object="$obj.o"
+args[$objarg]="$non_pic_object"
+__DOLTCOMPILE__EOF__
+        if test x$enable_shared = xyes; then
+            cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+"${args[@]}" >/dev/null 2>&1 || exit $?
+__DOLTCOMPILE__EOF__
+        else
+            cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+"${args[@]}" || exit $?
+__DOLTCOMPILE__EOF__
+        fi
+    fi
+
+    cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+{
+echo "# $lo - a libtool object file"
+echo "# Generated by doltcompile, not libtool"
+__DOLTCOMPILE__EOF__
+
+    if test x$enable_shared = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo "pic_object='.libs/${objbase}.o'"
+__DOLTCOMPILE__EOF__
+    else
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo pic_object=none
+__DOLTCOMPILE__EOF__
+    fi
+
+    if test x$enable_static = xyes; then
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo "non_pic_object='${objbase}.o'"
+__DOLTCOMPILE__EOF__
+    else
+        cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+echo non_pic_object=none
+__DOLTCOMPILE__EOF__
+    fi
+
+    cat <<'__DOLTCOMPILE__EOF__' >>doltcompile
+} > "$lo"
+__DOLTCOMPILE__EOF__
+
+    chmod +x doltcompile
+    LTCOMPILE='$(top_builddir)/doltcompile $(COMPILE)'
+    LTCXXCOMPILE='$(top_builddir)/doltcompile $(CXXCOMPILE)'
+
+    cat <<__DOLTLIBTOOL__EOF__ > doltlibtool
+#!$DOLT_BASH
+__DOLTLIBTOOL__EOF__
+    cat <<'__DOLTLIBTOOL__EOF__' >>doltlibtool
+top_builddir_slash="${0%%doltlibtool}"
+: ${top_builddir_slash:=./}
+args=()
+modeok=false
+tagok=false
+for arg in "$@"; do
+    case "$arg" in
+        --mode=compile) modeok=true ;;
+        --tag=CC|--tag=CXX) tagok=true ;;
+        *) args[${#args[@]}]="$arg" ;;
+    esac
+done
+if $modeok && $tagok ; then
+    . ${top_builddir_slash}doltcompile "${args[@]}"
+else
+    exec ${top_builddir_slash}libtool "$@"
+fi
+__DOLTLIBTOOL__EOF__
+
+    chmod +x doltlibtool
+    LIBTOOL='$(top_builddir)/doltlibtool'
+fi
+
+
+# end dolt
+
+
+for ac_header in sys/mman.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_mman_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_MMAN_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in sys/param.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_param_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_PARAM_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in winsock2.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_WINSOCK2_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in string.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default"
+if test "x$ac_cv_header_string_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STRING_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in stdlib.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdlib_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STDLIB_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in netdb.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default"
+if test "x$ac_cv_header_netdb_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NETDB_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in regex.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "regex.h" "ac_cv_header_regex_h" "$ac_includes_default"
+if test "x$ac_cv_header_regex_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_REGEX_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in time.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "time.h" "ac_cv_header_time_h" "$ac_includes_default"
+if test "x$ac_cv_header_time_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_TIME_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in poll.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default"
+if test "x$ac_cv_header_poll_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_POLL_H 1
+_ACEOF
+
+fi
+
+done
+
+
+ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
+if test "x$ac_cv_type_off_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define off_t long int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
+if test "x$ac_cv_type_ssize_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define ssize_t int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
+if test "x$ac_cv_type_mode_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define mode_t int
+_ACEOF
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nfds_t" >&5
+$as_echo_n "checking for nfds_t... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include 
+	#include 
+
+int
+main ()
+{
+
+	nfds_t nfds = 1;
+	return nfds;
+
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+
+$as_echo "#define nfds_t unsigned long int" >>confdefs.h
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+for ac_func in strftime localtime gmtime_r gmtime_s
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+  for ac_header in $ac_header_list
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+for ac_func in getpagesize
+do :
+  ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
+if test "x$ac_cv_func_getpagesize" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GETPAGESIZE 1
+_ACEOF
+
+fi
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
+$as_echo_n "checking for working mmap... " >&6; }
+if ${ac_cv_func_mmap_fixed_mapped+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_mmap_fixed_mapped=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+/* malloc might have been renamed as rpl_malloc. */
+#undef malloc
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+   Here is a matrix of mmap possibilities:
+	mmap private not fixed
+	mmap private fixed at somewhere currently unmapped
+	mmap private fixed at somewhere already mapped
+	mmap shared not fixed
+	mmap shared fixed at somewhere currently unmapped
+	mmap shared fixed at somewhere already mapped
+   For private mappings, we should verify that changes cannot be read()
+   back from the file, nor mmap's back from the file at a different
+   address.  (There have been systems where private was not correctly
+   implemented like the infamous i386 svr4.0, and systems where the
+   VM page cache was not coherent with the file system buffer cache
+   like early versions of FreeBSD and possibly contemporary NetBSD.)
+   For shared mappings, we should conversely verify that changes get
+   propagated back to all the places they're supposed to be.
+
+   Grep wants private fixed already mapped.
+   The main things grep needs to know about mmap are:
+   * does it exist and is it safe to write into the mmap'd area
+   * how to use it (BSD variants)  */
+
+#include 
+#include 
+
+#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
+char *malloc ();
+#endif
+
+/* This mess was copied from the GNU getpagesize.h.  */
+#ifndef HAVE_GETPAGESIZE
+# ifdef _SC_PAGESIZE
+#  define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+#  ifdef HAVE_SYS_PARAM_H
+#   include 
+#   ifdef EXEC_PAGESIZE
+#    define getpagesize() EXEC_PAGESIZE
+#   else /* no EXEC_PAGESIZE */
+#    ifdef NBPG
+#     define getpagesize() NBPG * CLSIZE
+#     ifndef CLSIZE
+#      define CLSIZE 1
+#     endif /* no CLSIZE */
+#    else /* no NBPG */
+#     ifdef NBPC
+#      define getpagesize() NBPC
+#     else /* no NBPC */
+#      ifdef PAGESIZE
+#       define getpagesize() PAGESIZE
+#      endif /* PAGESIZE */
+#     endif /* no NBPC */
+#    endif /* no NBPG */
+#   endif /* no EXEC_PAGESIZE */
+#  else /* no HAVE_SYS_PARAM_H */
+#   define getpagesize() 8192	/* punt totally */
+#  endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+int
+main ()
+{
+  char *data, *data2, *data3;
+  const char *cdata2;
+  int i, pagesize;
+  int fd, fd2;
+
+  pagesize = getpagesize ();
+
+  /* First, make a file with some known garbage in it. */
+  data = (char *) malloc (pagesize);
+  if (!data)
+    return 1;
+  for (i = 0; i < pagesize; ++i)
+    *(data + i) = rand ();
+  umask (0);
+  fd = creat ("conftest.mmap", 0600);
+  if (fd < 0)
+    return 2;
+  if (write (fd, data, pagesize) != pagesize)
+    return 3;
+  close (fd);
+
+  /* Next, check that the tail of a page is zero-filled.  File must have
+     non-zero length, otherwise we risk SIGBUS for entire page.  */
+  fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600);
+  if (fd2 < 0)
+    return 4;
+  cdata2 = "";
+  if (write (fd2, cdata2, 1) != 1)
+    return 5;
+  data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L);
+  if (data2 == MAP_FAILED)
+    return 6;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data2 + i))
+      return 7;
+  close (fd2);
+  if (munmap (data2, pagesize))
+    return 8;
+
+  /* Next, try to mmap the file at a fixed address which already has
+     something else allocated at it.  If we can, also make sure that
+     we see the same garbage.  */
+  fd = open ("conftest.mmap", O_RDWR);
+  if (fd < 0)
+    return 9;
+  if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+		     MAP_PRIVATE | MAP_FIXED, fd, 0L))
+    return 10;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data2 + i))
+      return 11;
+
+  /* Finally, make sure that changes to the mapped area do not
+     percolate back to the file as seen by read().  (This is a bug on
+     some variants of i386 svr4.0.)  */
+  for (i = 0; i < pagesize; ++i)
+    *(data2 + i) = *(data2 + i) + 1;
+  data3 = (char *) malloc (pagesize);
+  if (!data3)
+    return 12;
+  if (read (fd, data3, pagesize) != pagesize)
+    return 13;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data3 + i))
+      return 14;
+  close (fd);
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_mmap_fixed_mapped=yes
+else
+  ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5
+$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; }
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+$as_echo "#define HAVE_MMAP 1" >>confdefs.h
+
+fi
+rm -f conftest.mmap conftest.txt
+
+for ac_func in munmap msync
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in select poll
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.9.0
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		PKG_CONFIG=""
+	fi
+fi
+
+
+
+    # Extract the first word of "gtkdoc-check", so it can be a program name with args.
+set dummy gtkdoc-check; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_CHECK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_CHECK in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GTKDOC_CHECK="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_CHECK=$ac_cv_path_GTKDOC_CHECK
+if test -n "$GTKDOC_CHECK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5
+$as_echo "$GTKDOC_CHECK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  for ac_prog in gtkdoc-rebase
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_REBASE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_REBASE in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE
+if test -n "$GTKDOC_REBASE"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5
+$as_echo "$GTKDOC_REBASE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$GTKDOC_REBASE" && break
+done
+test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true"
+
+  # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args.
+set dummy gtkdoc-mkpdf; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GTKDOC_MKPDF+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GTKDOC_MKPDF in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF
+if test -n "$GTKDOC_MKPDF"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5
+$as_echo "$GTKDOC_MKPDF" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+# Check whether --with-html-dir was given.
+if test "${with_html_dir+set}" = set; then :
+  withval=$with_html_dir;
+else
+  with_html_dir='${datadir}/gtk-doc/html'
+fi
+
+  HTML_DIR="$with_html_dir"
+
+
+    # Check whether --enable-gtk-doc was given.
+if test "${enable_gtk_doc+set}" = set; then :
+  enableval=$enable_gtk_doc;
+else
+  enable_gtk_doc=no
+fi
+
+
+  if test x$enable_gtk_doc = xyes; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.8\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.8") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  :
+else
+  as_fn_error $? "You need to have gtk-doc >= 1.8 installed to build $PACKAGE_NAME" "$LINENO" 5
+fi
+        if test "x$PACKAGE_NAME" != "xglib"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5
+$as_echo_n "checking for GTKDOC_DEPS... " >&6; }
+
+if test -n "$GTKDOC_DEPS_CFLAGS"; then
+    pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GTKDOC_DEPS_LIBS"; then
+    pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>&1`
+        else
+	        GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GTKDOC_DEPS_PKG_ERRORS" >&5
+
+	as_fn_error $? "Package requirements (glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0) were not met:
+
+$GTKDOC_DEPS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS
+and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS
+and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see .
+See \`config.log' for more details" "$LINENO" 5; }
+else
+	GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS
+	GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+    fi
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5
+$as_echo_n "checking whether to build gtk-doc documentation... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5
+$as_echo "$enable_gtk_doc" >&6; }
+
+    # Check whether --enable-gtk-doc-html was given.
+if test "${enable_gtk_doc_html+set}" = set; then :
+  enableval=$enable_gtk_doc_html;
+else
+  enable_gtk_doc_html=yes
+fi
+
+    # Check whether --enable-gtk-doc-pdf was given.
+if test "${enable_gtk_doc_pdf+set}" = set; then :
+  enableval=$enable_gtk_doc_pdf;
+else
+  enable_gtk_doc_pdf=no
+fi
+
+
+  if test -z "$GTKDOC_MKPDF"; then
+    enable_gtk_doc_pdf=no
+  fi
+
+
+   if test x$enable_gtk_doc = xyes; then
+  ENABLE_GTK_DOC_TRUE=
+  ENABLE_GTK_DOC_FALSE='#'
+else
+  ENABLE_GTK_DOC_TRUE='#'
+  ENABLE_GTK_DOC_FALSE=
+fi
+
+   if test x$enable_gtk_doc_html = xyes; then
+  GTK_DOC_BUILD_HTML_TRUE=
+  GTK_DOC_BUILD_HTML_FALSE='#'
+else
+  GTK_DOC_BUILD_HTML_TRUE='#'
+  GTK_DOC_BUILD_HTML_FALSE=
+fi
+
+   if test x$enable_gtk_doc_pdf = xyes; then
+  GTK_DOC_BUILD_PDF_TRUE=
+  GTK_DOC_BUILD_PDF_FALSE='#'
+else
+  GTK_DOC_BUILD_PDF_TRUE='#'
+  GTK_DOC_BUILD_PDF_FALSE=
+fi
+
+   if test -n "$LIBTOOL"; then
+  GTK_DOC_USE_LIBTOOL_TRUE=
+  GTK_DOC_USE_LIBTOOL_FALSE='#'
+else
+  GTK_DOC_USE_LIBTOOL_TRUE='#'
+  GTK_DOC_USE_LIBTOOL_FALSE=
+fi
+
+   if test -n "$GTKDOC_REBASE"; then
+  GTK_DOC_USE_REBASE_TRUE=
+  GTK_DOC_USE_REBASE_FALSE='#'
+else
+  GTK_DOC_USE_REBASE_TRUE='#'
+  GTK_DOC_USE_REBASE_FALSE=
+fi
+
+
+
+for ac_prog in db2html docbook2html
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_DB2HTML+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $DB2HTML in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_DB2HTML="$DB2HTML" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_DB2HTML="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+DB2HTML=$ac_cv_path_DB2HTML
+if test -n "$DB2HTML"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DB2HTML" >&5
+$as_echo "$DB2HTML" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$DB2HTML" && break
+done
+
+ if test -n "$DB2HTML"; then
+  HAVE_DOCBOOK_TRUE=
+  HAVE_DOCBOOK_FALSE='#'
+else
+  HAVE_DOCBOOK_TRUE='#'
+  HAVE_DOCBOOK_FALSE=
+fi
+
+
+ if test "x$enable_gtk_doc" = "xyes"; then
+  ENABLE_GTK_DOC_TRUE=
+  ENABLE_GTK_DOC_FALSE='#'
+else
+  ENABLE_GTK_DOC_TRUE='#'
+  ENABLE_GTK_DOC_FALSE=
+fi
+
+
+# Check whether --enable-profiling was given.
+if test "${enable_profiling+set}" = set; then :
+  enableval=$enable_profiling;
+else
+  enable_profiling="no"
+fi
+
+if test "x$enable_profiling" = "xyes"; then
+# CFLAGS="-O0 -g -pg -fprofile-arcs -ftest-coverage"
+  CFLAGS="-O0 -g -pg"
+fi
+
+# Check whether --enable-warnings was given.
+if test "${enable_warnings+set}" = set; then :
+  enableval=$enable_warnings;
+else
+  enable_warnings="no"
+fi
+
+if test "x$enable_warnings" = "xyes"; then
+
+$as_echo "#define ENABLE_WARNINGS 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-strict-parser was given.
+if test "${enable_strict_parser+set}" = set; then :
+  enableval=$enable_strict_parser;
+else
+  enable_strict_parser="no"
+fi
+
+if test "x$enable_strict_parser" = "xyes"; then
+
+$as_echo "#define STRICT_PARSER 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-cryptography was given.
+if test "${enable_cryptography+set}" = set; then :
+  enableval=$enable_cryptography;
+else
+  enable_cryptography="yes"
+fi
+
+ if test "x$enable_cryptography" = "xyes"; then
+  ENABLE_CRYPTOGRAPHY_TRUE=
+  ENABLE_CRYPTOGRAPHY_FALSE='#'
+else
+  ENABLE_CRYPTOGRAPHY_TRUE='#'
+  ENABLE_CRYPTOGRAPHY_FALSE=
+fi
+
+if test "x$enable_cryptography" = "xyes"; then
+
+$as_echo "#define ENABLE_CRYPTOGRAPHY 1" >>confdefs.h
+
+fi
+
+
+# Check whether --enable-glibtest was given.
+if test "${enable_glibtest+set}" = set; then :
+  enableval=$enable_glibtest;
+else
+  enable_glibtest=yes
+fi
+
+
+  pkg_config_args=glib-2.0
+  for module in . gobject gmodule gthread gio
+  do
+      case "$module" in
+         gmodule)
+             pkg_config_args="$pkg_config_args gmodule-2.0"
+         ;;
+         gmodule-no-export)
+             pkg_config_args="$pkg_config_args gmodule-no-export-2.0"
+         ;;
+         gobject)
+             pkg_config_args="$pkg_config_args gobject-2.0"
+         ;;
+         gthread)
+             pkg_config_args="$pkg_config_args gthread-2.0"
+         ;;
+         gio*)
+             pkg_config_args="$pkg_config_args $module-2.0"
+         ;;
+      esac
+  done
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.16
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		PKG_CONFIG=""
+	fi
+fi
+
+  no_glib=""
+
+  if test "x$PKG_CONFIG" = x ; then
+    no_glib=yes
+    PKG_CONFIG=no
+  fi
+
+  min_glib_version=2.18.0
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB - version >= $min_glib_version" >&5
+$as_echo_n "checking for GLIB - version >= $min_glib_version... " >&6; }
+
+  if test x$PKG_CONFIG != xno ; then
+    ## don't try to run the test against uninstalled libtool libs
+    if $PKG_CONFIG --uninstalled $pkg_config_args; then
+	  echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH"
+	  enable_glibtest=no
+    fi
+
+    if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then
+	  :
+    else
+	  no_glib=yes
+    fi
+  fi
+
+  if test x"$no_glib" = x ; then
+    GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
+    GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0`
+    GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+    GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable=glib_compile_resources gio-2.0`
+
+    GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args`
+    GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args`
+    glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+    glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+    glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+    if test "x$enable_glibtest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GLIB_CFLAGS"
+      LIBS="$GLIB_LIBS $LIBS"
+      rm -f conf.glibtest
+      if test "$cross_compiling" = yes; then :
+  echo $ac_n "cross compiling; assumed OK... $ac_c"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include 
+#include 
+#include 
+
+int
+main ()
+{
+  unsigned int major, minor, micro;
+  char *tmp_version;
+
+  fclose (fopen ("conf.glibtest", "w"));
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_glib_version");
+  if (sscanf(tmp_version, "%u.%u.%u", &major, &minor, µ) != 3) {
+     printf("%s, bad version string\n", "$min_glib_version");
+     exit(1);
+   }
+
+  if ((glib_major_version != $glib_config_major_version) ||
+      (glib_minor_version != $glib_config_minor_version) ||
+      (glib_micro_version != $glib_config_micro_version))
+    {
+      printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n",
+             $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
+             glib_major_version, glib_minor_version, glib_micro_version);
+      printf ("*** was found! If pkg-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GLib. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+      printf("*** to point to the correct configuration files\n");
+    }
+  else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
+	   (glib_minor_version != GLIB_MINOR_VERSION) ||
+           (glib_micro_version != GLIB_MICRO_VERSION))
+    {
+      printf("*** GLIB header files (version %d.%d.%d) do not match\n",
+	     GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+	     glib_major_version, glib_minor_version, glib_micro_version);
+    }
+  else
+    {
+      if ((glib_major_version > major) ||
+        ((glib_major_version == major) && (glib_minor_version > minor)) ||
+        ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GLIB (%u.%u.%u) was found.\n",
+               glib_major_version, glib_minor_version, glib_micro_version);
+        printf("*** You need a version of GLIB newer than %u.%u.%u. The latest version of\n",
+	       major, minor, micro);
+        printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n");
+        printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  no_glib=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_glib" = x ; then
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)" >&5
+$as_echo "yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version)" >&6; }
+     :
+  else
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+     if test "$PKG_CONFIG" = "no" ; then
+       echo "*** A new enough version of pkg-config was not found."
+       echo "*** See http://www.freedesktop.org/software/pkgconfig/"
+     else
+       if test -f conf.glibtest ; then
+        :
+       else
+          echo "*** Could not run GLIB test program, checking why..."
+          ac_save_CFLAGS="$CFLAGS"
+          ac_save_LIBS="$LIBS"
+          CFLAGS="$CFLAGS $GLIB_CFLAGS"
+          LIBS="$LIBS $GLIB_LIBS"
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include 
+#include 
+
+int
+main ()
+{
+ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version));
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+   echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GLIB or finding the wrong"
+          echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+	  echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+else
+   echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GLIB is incorrectly installed."
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GLIB_CFLAGS=""
+     GLIB_LIBS=""
+     GLIB_GENMARSHAL=""
+     GOBJECT_QUERY=""
+     GLIB_MKENUMS=""
+     GLIB_COMPILE_RESOURCES=""
+     as_fn_error $? "Cannot find GLIB: Is pkg-config in your path?" "$LINENO" 5
+  fi
+
+
+
+
+
+
+  rm -f conf.glibtest
+
+
+for ac_header in zlib.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_zlib_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_ZLIB_H 1
+_ACEOF
+
+fi
+
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
+$as_echo_n "checking for inflate in -lz... " >&6; }
+if ${ac_cv_lib_z_inflate+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char inflate ();
+int
+main ()
+{
+return inflate ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_z_inflate=yes
+else
+  ac_cv_lib_z_inflate=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflate" >&5
+$as_echo "$ac_cv_lib_z_inflate" >&6; }
+if test "x$ac_cv_lib_z_inflate" = xyes; then :
+  ZLIB="-lz"
+fi
+
+
+
+      if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-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
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5
+$as_echo_n "checking for ld used by GCC... " >&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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${acl_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  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
+      acl_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.
+      case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+      *GNU* | *'with BFD'*)
+        test "$with_gnu_ld" != no && break ;;
+      *)
+        test "$with_gnu_ld" != yes && break ;;
+      esac
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${acl_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 &5
+$as_echo "$acl_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+
+                                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
+$as_echo_n "checking for shared library run path origin... " >&6; }
+if ${acl_cv_rpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
+$as_echo "$acl_cv_rpath" >&6; }
+  wl="$acl_cv_wl"
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+    # Check whether --enable-rpath was given.
+if test "${enable_rpath+set}" = set; then :
+  enableval=$enable_rpath; :
+else
+  enable_rpath=yes
+fi
+
+
+
+
+  acl_libdirstem=lib
+  acl_libdirstem2=
+  case "$host_os" in
+    solaris*)
+                                    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5
+$as_echo_n "checking for 64-bit host... " >&6; }
+if ${gl_cv_solaris_64bit+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _LP64
+sixtyfour bits
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "sixtyfour bits" >/dev/null 2>&1; then :
+  gl_cv_solaris_64bit=yes
+else
+  gl_cv_solaris_64bit=no
+fi
+rm -f conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5
+$as_echo "$gl_cv_solaris_64bit" >&6; }
+      if test $gl_cv_solaris_64bit = yes; then
+        acl_libdirstem=lib/64
+        case "$host_cpu" in
+          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
+          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+        esac
+      fi
+      ;;
+    *)
+      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+      if test -n "$searchpath"; then
+        acl_save_IFS="${IFS= 	}"; IFS=":"
+        for searchdir in $searchpath; do
+          if test -d "$searchdir"; then
+            case "$searchdir" in
+              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+              */../ | */.. )
+                # Better ignore directories of this form. They are misleading.
+                ;;
+              *) searchdir=`cd "$searchdir" && pwd`
+                 case "$searchdir" in
+                   */lib64 ) acl_libdirstem=lib64 ;;
+                 esac ;;
+            esac
+          fi
+        done
+        IFS="$acl_save_IFS"
+      fi
+      ;;
+  esac
+  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+
+
+
+
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then :
+  withval=$with_libiconv_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+
+fi
+
+      LIBICONV=
+  LTLIBICONV=
+  INCICONV=
+  LIBICONV_PREFIX=
+      HAVE_LIBICONV=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='iconv '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$acl_hardcode_direct" = yes; then
+                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+              else
+                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = 'iconv'; then
+                  LIBICONV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = 'iconv'; then
+                  LIBICONV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+    done
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+          am_save_CPPFLAGS="$CPPFLAGS"
+
+  for element in $INCICONV; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+$as_echo_n "checking for iconv... " >&6; }
+if ${am_cv_func_iconv+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+#include 
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$am_save_LIBS"
+    fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+$as_echo "$am_cv_func_iconv" >&6; }
+  if test "$am_cv_func_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+$as_echo_n "checking for working iconv... " >&6; }
+if ${am_cv_func_iconv_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+            am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+           *)            am_cv_func_iconv_works="guessing yes" ;;
+         esac
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include 
+#include 
+int main ()
+{
+  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+     returns.  */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static const char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          return 1;
+      }
+  }
+  /* Test against Solaris 10 bug: Failures are not distinguishable from
+     successful returns.  */
+  {
+    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+    if (cd_ascii_to_88591 != (iconv_t)(-1))
+      {
+        static const char input[] = "\263";
+        char buf[10];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_ascii_to_88591,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          return 1;
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        const char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            (char **) &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          return 1;
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  if (/* Try standardized names.  */
+      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+      /* Try IRIX, OSF/1 names.  */
+      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+      /* Try AIX names.  */
+      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+      /* Try HP-UX names.  */
+      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+    return 1;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  am_cv_func_iconv_works=yes
+else
+  am_cv_func_iconv_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+      LIBS="$am_save_LIBS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+$as_echo "$am_cv_func_iconv_works" >&6; }
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+
+$as_echo "#define HAVE_ICONV 1" >>confdefs.h
+
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+$as_echo_n "checking how to link with libiconv... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+$as_echo "$LIBICONV" >&6; }
+  else
+            CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+
+
+
+  if test "$am_cv_func_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5
+$as_echo_n "checking for iconv declaration... " >&6; }
+    if ${am_cv_proto_iconv+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include 
+#include 
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  am_cv_proto_iconv_arg1=""
+else
+  am_cv_proto_iconv_arg1="const"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
+fi
+
+    am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result:
+         $am_cv_proto_iconv" >&5
+$as_echo "
+         $am_cv_proto_iconv" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define ICONV_CONST $am_cv_proto_iconv_arg1
+_ACEOF
+
+  fi
+
+
+CFLAGS_save="$CFLAGS"
+CFLAGS="$CFLAGS -I$srcdir"
+LIBS_save="$LIBS"
+LIBS="$LIBS $LIBICONV"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking preferred charset formats for system iconv" >&5
+$as_echo_n "checking preferred charset formats for system iconv... " >&6; }
+if ${ac_cv_have_iconv_detect_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+	if test "$cross_compiling" = yes; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot run test program while cross compiling" >&5
+$as_echo "cannot run test program while cross compiling" >&6; }
+		as_fn_error $? "Copy target system's iconv-detect.h to . and configure with ac_cv_have_iconv_detect_h=yes" "$LINENO" 5
+
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+		#define CONFIGURE_IN
+		#include "iconv-detect.c"
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_have_iconv_detect_h=yes
+else
+  ac_cv_have_iconv_detect_h=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_iconv_detect_h" >&5
+$as_echo "$ac_cv_have_iconv_detect_h" >&6; }
+if test "x$ac_cv_have_iconv_detect_h" = xyes; then
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+
+$as_echo "#define HAVE_ICONV_DETECT_H 1" >>confdefs.h
+
+else
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found
+	*** The iconv-detect program was unable to determine the
+	*** preferred charset formats recognized by your system
+	*** iconv library. It is suggested that you install a
+	*** working iconv library such as the one found at
+	*** ftp://ftp.gnu.org/pub/gnu/libiconv
+	***
+	*** Default charset formats will be used.
+	" >&5
+$as_echo "not found
+	*** The iconv-detect program was unable to determine the
+	*** preferred charset formats recognized by your system
+	*** iconv library. It is suggested that you install a
+	*** working iconv library such as the one found at
+	*** ftp://ftp.gnu.org/pub/gnu/libiconv
+	***
+	*** Default charset formats will be used.
+	" >&6; }
+fi
+
+CFLAGS="$CFLAGS_save"
+LIBS="$LIBS_save"
+
+ac_fn_c_check_header_mongrel "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default"
+if test "x$ac_cv_header_getopt_h" = xyes; then :
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU getopt_long" >&5
+$as_echo_n "checking for GNU getopt_long... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include 
+	#include 
+	#define _GNU_SOURCE
+	#include 
+
+int
+main ()
+{
+
+	return getopt_long (0, NULL, NULL, NULL, NULL);
+
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_GETOPT_H 1" >>confdefs.h
+
+	have_getopt="yes"
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	have_getopt="no"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+ if test "x$have_getopt" = "xyes"; then
+  SYSTEM_GETOPT_TRUE=
+  SYSTEM_GETOPT_FALSE='#'
+else
+  SYSTEM_GETOPT_TRUE='#'
+  SYSTEM_GETOPT_FALSE=
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fsync" >&5
+$as_echo_n "checking for fsync... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include 
+
+int
+main ()
+{
+
+	fsync(0);
+
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_FSYNC 1" >>confdefs.h
+
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MAXHOSTNAMELEN" >&5
+$as_echo_n "checking for MAXHOSTNAMELEN... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include 
+
+int
+main ()
+{
+
+	return MAXHOSTNAMELEN;
+
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+
+$as_echo "#define MAXHOSTNAMELEN 64" >>confdefs.h
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no; defined as 64" >&5
+$as_echo "no; defined as 64" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for domainname in struct utsname" >&5
+$as_echo_n "checking for domainname in struct utsname... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#define _GNU_SOURCE
+	#include 
+
+int
+main ()
+{
+
+	struct utsname unam;
+
+	unam.domainname[0] = '\0';
+
+	return unam.domainname[0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_UTSNAME_DOMAINNAME 1" >>confdefs.h
+
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tm_gmtoff in struct tm" >&5
+$as_echo_n "checking for tm_gmtoff in struct tm... " >&6; }
+if ${ac_cv_struct_tm_gmtoff+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+		#include 
+
+int
+main ()
+{
+
+		struct tm tm;
+		tm.tm_gmtoff = 1;
+		return tm.tm_gmtoff;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_struct_tm_gmtoff="yes"
+else
+  ac_cv_struct_tm_gmtoff="no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm_gmtoff" >&5
+$as_echo "$ac_cv_struct_tm_gmtoff" >&6; }
+if test "$ac_cv_struct_tm_gmtoff" = "yes"; then
+
+$as_echo "#define HAVE_TM_GMTOFF 1" >>confdefs.h
+
+else
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for timezone variable" >&5
+$as_echo_n "checking for timezone variable... " >&6; }
+if ${ac_cv_var_timezone+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+			#include 
+
+int
+main ()
+{
+
+			timezone = 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_var_timezone="yes"
+else
+  ac_cv_var_timezone="no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_timezone" >&5
+$as_echo "$ac_cv_var_timezone" >&6; }
+	if test "$ac_cv_var_timezone" = "yes"; then
+
+$as_echo "#define HAVE_TIMEZONE 1" >>confdefs.h
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for altzone variable" >&5
+$as_echo_n "checking for altzone variable... " >&6; }
+if ${ac_cv_var_altzone+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+				#include 
+
+int
+main ()
+{
+
+				altzone = 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_var_altzone="yes"
+else
+  ac_cv_var_altzone="no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_altzone" >&5
+$as_echo "$ac_cv_var_altzone" >&6; }
+		if test "$ac_cv_var_altzone" = "yes"; then
+
+$as_echo "#define HAVE_ALTZONE 1" >>confdefs.h
+
+		fi
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _timezone variable" >&5
+$as_echo_n "checking for _timezone variable... " >&6; }
+if ${ac_cv_var__timezone+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+				#include 
+
+int
+main ()
+{
+
+				_timezone = 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_var__timezone="yes"
+else
+  ac_cv_var__timezone="no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var__timezone" >&5
+$as_echo "$ac_cv_var__timezone" >&6; }
+		if test "$ac_cv_var__timezone" = "yes"; then
+
+$as_echo "#define HAVE__TIMEZONE 1" >>confdefs.h
+
+		else
+			as_fn_error $? "unable to find a way to determine timezone" "$LINENO" 5
+		fi
+	fi
+fi
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+else
+  enable_largefile="yes"
+fi
+
+if test "x$enable_largefile" != "xno"; then
+    # Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+	 # IRIX 6.2 and later do not support large files by default,
+	 # so use the C compiler's -n32 option if that helps.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 CC="$CC -n32"
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include 
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include 
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include 
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE64_SOURCE value needed for large files" >&5
+$as_echo_n "checking for _LARGEFILE64_SOURCE value needed for large files... " >&6; }
+if ${ac_cv_largefile64_source+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+		#include 
+		#include 
+		#include 
+
+int
+main ()
+{
+
+		return open ("__o_largefile", O_CREAT | O_RDWR | O_LARGEFILE, 0644);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+		ac_cv_largefile64_source="no"
+
+else
+
+		cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+			#define _LARGEFILE64_SOURCE
+			#include 
+			#include 
+			#include 
+
+int
+main ()
+{
+
+			return open ("__o_largefile", O_CREAT | O_RDWR | O_LARGEFILE, 0644);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+			ac_cv_largefile64_source="yes"
+
+else
+
+			ac_cv_largefile64_source="unknown"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_largefile64_source" >&5
+$as_echo "$ac_cv_largefile64_source" >&6; }
+
+    enable_largefile="no"
+
+    if test "x$ac_cv_largefile64_source" = "xyes"; then
+        LFS_CFLAGS="-D_LARGEFILE64_SOURCE"
+        enable_largefile="yes"
+    elif test "x$ac_cv_largefile64_source" = "xunknown"; then
+
+$as_echo "#define O_LARGEFILE 0" >>confdefs.h
+
+    fi
+
+    if test -n "$ac_cv_sys_large_files" -a "x$ac_cv_sys_large_files" != "xno"; then
+        LFS_CFLAGS="$LFS_CFLAGS -D_LARGE_FILES"
+        enable_largefile="yes"
+    fi
+
+    if test "x$ac_cv_sys_file_offset_bits" != "xno"; then
+        LFS_CFLAGS="$LFS_CFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
+        enable_largefile="yes"
+    fi
+else
+    LFS_CFLAGS=""
+fi
+ if test "x$enable_largefile" = "xyes"; then
+  ENABLE_LARGEFILE_TRUE=
+  ENABLE_LARGEFILE_FALSE='#'
+else
+  ENABLE_LARGEFILE_TRUE='#'
+  ENABLE_LARGEFILE_FALSE=
+fi
+
+
+CFLAGS_save="$CFLAGS"
+CFLAGS="$CFLAGS $LFS_CFLAGS"
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of ssize_t" >&5
+$as_echo_n "checking size of ssize_t... " >&6; }
+if ${ac_cv_sizeof_ssize_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (ssize_t))" "ac_cv_sizeof_ssize_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_ssize_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (ssize_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_ssize_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_ssize_t" >&5
+$as_echo "$ac_cv_sizeof_ssize_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SSIZE_T $ac_cv_sizeof_ssize_t
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5
+$as_echo_n "checking size of size_t... " >&6; }
+if ${ac_cv_sizeof_size_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_size_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (size_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_size_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5
+$as_echo "$ac_cv_sizeof_size_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5
+$as_echo_n "checking size of off_t... " >&6; }
+if ${ac_cv_sizeof_off_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_off_t" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (off_t)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_off_t=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5
+$as_echo "$ac_cv_sizeof_off_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_OFF_T $ac_cv_sizeof_off_t
+_ACEOF
+
+
+CFLAGS="$CFLAGS_save"
+
+for ac_func in gethostname getdomainname getaddrinfo
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+LIBSOCKET=""
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in -lsocket" >&5
+$as_echo_n "checking for getaddrinfo in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_getaddrinfo+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getaddrinfo ();
+int
+main ()
+{
+return getaddrinfo ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_socket_getaddrinfo=yes
+else
+  ac_cv_lib_socket_getaddrinfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_getaddrinfo" >&5
+$as_echo "$ac_cv_lib_socket_getaddrinfo" >&6; }
+if test "x$ac_cv_lib_socket_getaddrinfo" = xyes; then :
+  LIBSOCKET="-lsocket"
+fi
+
+
+LIBNSL=""
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in -lnsl" >&5
+$as_echo_n "checking for getaddrinfo in -lnsl... " >&6; }
+if ${ac_cv_lib_nsl_getaddrinfo+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getaddrinfo ();
+int
+main ()
+{
+return getaddrinfo ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_nsl_getaddrinfo=yes
+else
+  ac_cv_lib_nsl_getaddrinfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_getaddrinfo" >&5
+$as_echo "$ac_cv_lib_nsl_getaddrinfo" >&6; }
+if test "x$ac_cv_lib_nsl_getaddrinfo" = xyes; then :
+  LIBNSL="-lnsl"
+fi
+
+
+# Check whether --enable-smime was given.
+if test "${enable_smime+set}" = set; then :
+  enableval=$enable_smime;
+else
+  enable_smime="no"
+fi
+
+
+if test "x$enable_cryptography" != "xyes"; then
+   enable_smime="no"
+fi
+
+if test "x$enable_smime" = "xyes"; then
+
+# Check whether --with-gpgme-prefix was given.
+if test "${with_gpgme_prefix+set}" = set; then :
+  withval=$with_gpgme_prefix; gpgme_config_prefix="$withval"
+else
+  gpgme_config_prefix=""
+fi
+
+  if test "x$gpgme_config_prefix" != x ; then
+      GPGME_CONFIG="$gpgme_config_prefix/bin/gpgme-config"
+  fi
+  # Extract the first word of "gpgme-config", so it can be a program name with args.
+set dummy gpgme-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GPGME_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GPGME_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GPGME_CONFIG="$GPGME_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GPGME_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GPGME_CONFIG" && ac_cv_path_GPGME_CONFIG="no"
+  ;;
+esac
+fi
+GPGME_CONFIG=$ac_cv_path_GPGME_CONFIG
+if test -n "$GPGME_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GPGME_CONFIG" >&5
+$as_echo "$GPGME_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+  if test "$GPGME_CONFIG" != "no" ; then
+    gpgme_version=`$GPGME_CONFIG --version`
+  fi
+  gpgme_version_major=`echo $gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'`
+  gpgme_version_minor=`echo $gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'`
+  gpgme_version_micro=`echo $gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'`
+
+   tmp=1.1.6
+  if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+     req_gpgme_api=`echo "$tmp"     | sed 's/\(.*\):\(.*\)/\1/'`
+     min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+  else
+     req_gpgme_api=0
+     min_gpgme_version="$tmp"
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GPGME pthread - version >= $min_gpgme_version" >&5
+$as_echo_n "checking for GPGME pthread - version >= $min_gpgme_version... " >&6; }
+  ok=no
+  if test "$GPGME_CONFIG" != "no" ; then
+    if `$GPGME_CONFIG --thread=pthread 2> /dev/null` ; then
+      req_major=`echo $min_gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
+      req_minor=`echo $min_gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
+      req_micro=`echo $min_gpgme_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
+      if test "$gpgme_version_major" -gt "$req_major"; then
+        ok=yes
+      else
+        if test "$gpgme_version_major" -eq "$req_major"; then
+          if test "$gpgme_version_minor" -gt "$req_minor"; then
+            ok=yes
+          else
+            if test "$gpgme_version_minor" -eq "$req_minor"; then
+              if test "$gpgme_version_micro" -ge "$req_micro"; then
+                ok=yes
+              fi
+            fi
+          fi
+        fi
+      fi
+    fi
+  fi
+  if test $ok = yes; then
+     # If we have a recent GPGME, we should also check that the
+     # API is compatible.
+     if test "$req_gpgme_api" -gt 0 ; then
+        tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0`
+        if test "$tmp" -gt 0 ; then
+           if test "$req_gpgme_api" -ne "$tmp" ; then
+             ok=no
+           fi
+        fi
+     fi
+  fi
+  if test $ok = yes; then
+    GPGME_PTHREAD_CFLAGS=`$GPGME_CONFIG --thread=pthread --cflags`
+    GPGME_PTHREAD_LIBS=`$GPGME_CONFIG --thread=pthread --libs`
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    enable_smime="yes (via GpgME)"
+  else
+    GPGME_PTHREAD_CFLAGS=""
+    GPGME_PTHREAD_LIBS=""
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    enable_smime="no"
+  fi
+
+
+
+   if test "x$enable_smime" != "xno"; then
+
+$as_echo "#define ENABLE_SMIME 1" >>confdefs.h
+
+   fi
+fi
+
+# Check whether --enable-mono was given.
+if test "${enable_mono+set}" = set; then :
+  enableval=$enable_mono;
+else
+  enable_mono="auto"
+fi
+
+if test "x$enable_mono" != "xno"; then
+	# Extract the first word of "mcs", so it can be a program name with args.
+set dummy mcs; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_CSC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $CSC in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_CSC="$CSC" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_CSC="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_CSC" && ac_cv_path_CSC="no"
+  ;;
+esac
+fi
+CSC=$ac_cv_path_CSC
+if test -n "$CSC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSC" >&5
+$as_echo "$CSC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+	# if we found mcs, make sure it's mono and not something else named
+	# mcs, such as Tru64's /usr/bin/mcs, for manipulating object file
+	# comment sections of eCOFF object files.
+	if test "x$CSC" != "xno"; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CSC is GNU Mono" >&5
+$as_echo_n "checking whether $CSC is GNU Mono... " >&6; }
+		$CSC --version > /dev/null 2>&1
+		if test $? -ne 0; then
+			CSC=no
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		else
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		fi
+	fi
+else
+	CSC="no"
+fi
+
+if test "x$CSC" = "xno"; then
+		if test "x$enable_mono" = "xyes"; then
+		as_fn_error $? "Could not find mcs" "$LINENO" 5
+	fi
+
+	enable_mono="no"
+	 if false; then
+  ENABLE_MONO_TRUE=
+  ENABLE_MONO_FALSE='#'
+else
+  ENABLE_MONO_TRUE='#'
+  ENABLE_MONO_FALSE=
+fi
+
+else
+	enable_mono="yes"
+	 if true; then
+  ENABLE_MONO_TRUE=
+  ENABLE_MONO_FALSE='#'
+else
+  ENABLE_MONO_TRUE='#'
+  ENABLE_MONO_FALSE=
+fi
+
+fi
+
+if test "x$enable_mono" = "xyes"; then
+	# Extract the first word of "gacutil", so it can be a program name with args.
+set dummy gacutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GACUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GACUTIL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GACUTIL="$GACUTIL" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GACUTIL="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GACUTIL" && ac_cv_path_GACUTIL="no"
+  ;;
+esac
+fi
+GACUTIL=$ac_cv_path_GACUTIL
+if test -n "$GACUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GACUTIL" >&5
+$as_echo "$GACUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+	if test "x$GACUTIL" = "xno"; then
+		as_fn_error $? "Your mono installation doesn't expose gacutil" "$LINENO" 5
+	fi
+
+
+
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB_SHARP" >&5
+$as_echo_n "checking for GLIB_SHARP... " >&6; }
+
+if test -n "$GLIB_SHARP_CFLAGS"; then
+    pkg_cv_GLIB_SHARP_CFLAGS="$GLIB_SHARP_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-sharp-2.0 >= 2.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-sharp-2.0 >= 2.4.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GLIB_SHARP_CFLAGS=`$PKG_CONFIG --cflags "glib-sharp-2.0 >= 2.4.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GLIB_SHARP_LIBS"; then
+    pkg_cv_GLIB_SHARP_LIBS="$GLIB_SHARP_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-sharp-2.0 >= 2.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "glib-sharp-2.0 >= 2.4.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GLIB_SHARP_LIBS=`$PKG_CONFIG --libs "glib-sharp-2.0 >= 2.4.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GLIB_SHARP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-sharp-2.0 >= 2.4.0" 2>&1`
+        else
+	        GLIB_SHARP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-sharp-2.0 >= 2.4.0" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GLIB_SHARP_PKG_ERRORS" >&5
+
+	as_fn_error $? "Package requirements (glib-sharp-2.0 >= 2.4.0) were not met:
+
+$GLIB_SHARP_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GLIB_SHARP_CFLAGS
+and GLIB_SHARP_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GLIB_SHARP_CFLAGS
+and GLIB_SHARP_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see .
+See \`config.log' for more details" "$LINENO" 5; }
+else
+	GLIB_SHARP_CFLAGS=$pkg_cv_GLIB_SHARP_CFLAGS
+	GLIB_SHARP_LIBS=$pkg_cv_GLIB_SHARP_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GAPI_TOOLS" >&5
+$as_echo_n "checking for GAPI_TOOLS... " >&6; }
+
+if test -n "$GAPI_TOOLS_CFLAGS"; then
+    pkg_cv_GAPI_TOOLS_CFLAGS="$GAPI_TOOLS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gapi-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gapi-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GAPI_TOOLS_CFLAGS=`$PKG_CONFIG --cflags "gapi-2.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GAPI_TOOLS_LIBS"; then
+    pkg_cv_GAPI_TOOLS_LIBS="$GAPI_TOOLS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gapi-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gapi-2.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GAPI_TOOLS_LIBS=`$PKG_CONFIG --libs "gapi-2.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GAPI_TOOLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gapi-2.0" 2>&1`
+        else
+	        GAPI_TOOLS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gapi-2.0" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GAPI_TOOLS_PKG_ERRORS" >&5
+
+	as_fn_error $? "Package requirements (gapi-2.0) were not met:
+
+$GAPI_TOOLS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GAPI_TOOLS_CFLAGS
+and GAPI_TOOLS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GAPI_TOOLS_CFLAGS
+and GAPI_TOOLS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see .
+See \`config.log' for more details" "$LINENO" 5; }
+else
+	GAPI_TOOLS_CFLAGS=$pkg_cv_GAPI_TOOLS_CFLAGS
+	GAPI_TOOLS_LIBS=$pkg_cv_GAPI_TOOLS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+	# Extract the first word of "gapi2-codegen", so it can be a program name with args.
+set dummy gapi2-codegen; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GAPI_CODEGEN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GAPI_CODEGEN in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GAPI_CODEGEN="$GAPI_CODEGEN" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GAPI_CODEGEN="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GAPI_CODEGEN" && ac_cv_path_GAPI_CODEGEN="no"
+  ;;
+esac
+fi
+GAPI_CODEGEN=$ac_cv_path_GAPI_CODEGEN
+if test -n "$GAPI_CODEGEN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GAPI_CODEGEN" >&5
+$as_echo "$GAPI_CODEGEN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+	if test "x$GAPI_CODEGEN" = "xno"; then
+        	as_fn_error $? "You need to install gtk-sharp2-gapi" "$LINENO" 5
+	fi
+
+	# Extract the first word of "gapi2-fixup", so it can be a program name with args.
+set dummy gapi2-fixup; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GAPI_FIXUP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GAPI_FIXUP in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GAPI_FIXUP="$GAPI_FIXUP" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GAPI_FIXUP="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GAPI_FIXUP" && ac_cv_path_GAPI_FIXUP="no"
+  ;;
+esac
+fi
+GAPI_FIXUP=$ac_cv_path_GAPI_FIXUP
+if test -n "$GAPI_FIXUP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GAPI_FIXUP" >&5
+$as_echo "$GAPI_FIXUP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+	if test "x$GAPI_FIXUP" = "xno"; then
+        	as_fn_error $? "You need to install gtk-sharp2-gapi" "$LINENO" 5
+	fi
+
+	# Extract the first word of "gapi2-parser", so it can be a program name with args.
+set dummy gapi2-parser; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GAPI_PARSER+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GAPI_PARSER in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GAPI_PARSER="$GAPI_PARSER" # Let the user override the test with a path.
+  ;;
+  *)
+  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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GAPI_PARSER="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GAPI_PARSER" && ac_cv_path_GAPI_PARSER="no"
+  ;;
+esac
+fi
+GAPI_PARSER=$ac_cv_path_GAPI_PARSER
+if test -n "$GAPI_PARSER"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GAPI_PARSER" >&5
+$as_echo "$GAPI_PARSER" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+	if test "x$GAPI_PARSER" = "xno"; then
+        	as_fn_error $? "You need to install gtk-sharp2-gapi" "$LINENO" 5
+	fi
+
+						MONO_INTERFACE_VERSION=0
+	API_VERSION="$GMIME_MAJOR_VERSION.$GMIME_MINOR_VERSION.0.$MONO_INTERFACE_VERSION"
+
+fi
+
+
+# Check whether --with-gacdir was given.
+if test "${with_gacdir+set}" = set; then :
+  withval=$with_gacdir; with_gacdir=$withval
+else
+  with_gacdir=\${prefix}/lib
+fi
+
+gacdir=$with_gacdir
+
+
+EXTRA_LIBS="$ZLIB"
+if test "x$LIBSOCKET" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $LIBSOCKET"
+fi
+if test "x$LIBNSL" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $LIBNSL"
+fi
+if test "x$LIBICONV" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $LIBICONV"
+fi
+if test "x$GPGME_PTHREAD_LIBS" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $GPGME_PTHREAD_LIBS"
+fi
+
+CFLAGS="$CFLAGS -fno-strict-aliasing"
+LIBS="$LIBS $EXTRA_LIBS"
+
+
+
+
+GMIME_CFLAGS="$LFS_CFLAGS $GPGME_PTHREAD_CFLAGS"
+GMIME_LIBDIR="-L${libdir}"
+GMIME_INCLUDEDIR="-I${includedir}/gmime-$GMIME_API_VERSION"
+GMIME_LIBS_PRIVATE="$EXTRA_LIBS"
+GMIME_LIBS="-lgmime-$GMIME_API_VERSION"
+
+
+
+
+
+
+
+
+ac_config_files="$ac_config_files Makefile m4/Makefile build/Makefile build/vs2008/Makefile build/vs2008/config-win32.h build/vs2010/Makefile build/vs2010/config-win32.h docs/Makefile docs/reference/Makefile docs/tutorial/Makefile util/Makefile gmime/Makefile gmime/gmime-version.h mono/Makefile mono/AssemblyInfo.cs mono/gmime-sharp.dll.config mono/gmime-sharp.pc tools/Makefile gmime.spec gmime.pc"
+
+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, we kill variables containing newlines.
+# 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.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}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 "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  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}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${PLATFORM_WIN32_TRUE}" && test -z "${PLATFORM_WIN32_FALSE}"; then
+  as_fn_error $? "conditional \"PLATFORM_WIN32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${OS_WIN32_TRUE}" && test -z "${OS_WIN32_FALSE}"; then
+  as_fn_error $? "conditional \"OS_WIN32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${OS_WIN32_X64_TRUE}" && test -z "${OS_WIN32_X64_FALSE}"; then
+  as_fn_error $? "conditional \"OS_WIN32_X64\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${MS_LIB_AVAILABLE_TRUE}" && test -z "${MS_LIB_AVAILABLE_FALSE}"; then
+  as_fn_error $? "conditional \"MS_LIB_AVAILABLE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GTK_DOC_USE_REBASE_TRUE}" && test -z "${GTK_DOC_USE_REBASE_FALSE}"; then
+  as_fn_error $? "conditional \"GTK_DOC_USE_REBASE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_DOCBOOK_TRUE}" && test -z "${HAVE_DOCBOOK_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_DOCBOOK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_CRYPTOGRAPHY_TRUE}" && test -z "${ENABLE_CRYPTOGRAPHY_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_CRYPTOGRAPHY\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SYSTEM_GETOPT_TRUE}" && test -z "${SYSTEM_GETOPT_FALSE}"; then
+  as_fn_error $? "conditional \"SYSTEM_GETOPT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_LARGEFILE_TRUE}" && test -z "${ENABLE_LARGEFILE_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_LARGEFILE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_MONO_TRUE}" && test -z "${ENABLE_MONO_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_MONO\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_MONO_TRUE}" && test -z "${ENABLE_MONO_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_MONO\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $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
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+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
+IFS=$as_save_IFS
+
+     ;;
+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
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; 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
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# 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
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval 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="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gmime $as_me 2.6.15, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -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 ."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+gmime config.status 2.6.15
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+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=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+ac_aux_dir='$ac_aux_dir'
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+    "build/Makefile") CONFIG_FILES="$CONFIG_FILES build/Makefile" ;;
+    "build/vs2008/Makefile") CONFIG_FILES="$CONFIG_FILES build/vs2008/Makefile" ;;
+    "build/vs2008/config-win32.h") CONFIG_FILES="$CONFIG_FILES build/vs2008/config-win32.h" ;;
+    "build/vs2010/Makefile") CONFIG_FILES="$CONFIG_FILES build/vs2010/Makefile" ;;
+    "build/vs2010/config-win32.h") CONFIG_FILES="$CONFIG_FILES build/vs2010/config-win32.h" ;;
+    "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
+    "docs/reference/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/Makefile" ;;
+    "docs/tutorial/Makefile") CONFIG_FILES="$CONFIG_FILES docs/tutorial/Makefile" ;;
+    "util/Makefile") CONFIG_FILES="$CONFIG_FILES util/Makefile" ;;
+    "gmime/Makefile") CONFIG_FILES="$CONFIG_FILES gmime/Makefile" ;;
+    "gmime/gmime-version.h") CONFIG_FILES="$CONFIG_FILES gmime/gmime-version.h" ;;
+    "mono/Makefile") CONFIG_FILES="$CONFIG_FILES mono/Makefile" ;;
+    "mono/AssemblyInfo.cs") CONFIG_FILES="$CONFIG_FILES mono/AssemblyInfo.cs" ;;
+    "mono/gmime-sharp.dll.config") CONFIG_FILES="$CONFIG_FILES mono/gmime-sharp.dll.config" ;;
+    "mono/gmime-sharp.pc") CONFIG_FILES="$CONFIG_FILES mono/gmime-sharp.pc" ;;
+    "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
+    "gmime.spec") CONFIG_FILES="$CONFIG_FILES gmime.spec" ;;
+    "gmime.pc") CONFIG_FILES="$CONFIG_FILES gmime.pc" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  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
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' >$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries 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[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' >$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #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.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # 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.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;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&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  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.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_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
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  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 "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/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_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool 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.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=""
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# 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
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# 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
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# 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
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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
+
+# 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
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# 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
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# 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 a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# 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\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# 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
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# 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
+
+# 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
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# 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
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # 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" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# 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=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || 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 || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+echo "
+
+Configuration:
+
+  Source code location: ${srcdir}
+  Install prefix:       ${prefix}
+  Compiler:             ${CC}
+
+  Profiling enabled:    ${enable_profiling}
+
+  Large file support:   ${enable_largefile}
+  Console warnings:     ${enable_warnings}
+  PGP/MIME support:     ${enable_cryptography}
+  S/MIME support:       ${enable_smime}
+  Strict parser:        ${enable_strict_parser}
+
+  Mono bindings:        ${enable_mono}
+"
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..6039986
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,663 @@
+# Process this file with autoconf to produce a configure script.
+# require autoconf 2.54
+AC_PREREQ(2.54)
+
+# Making releases:
+#   gmime_micro_version += 1;
+#   gmime_interface_age += 1;
+#   gmime_binary_age += 1;
+# if any functions have been added, set gmime_interface_age to 0.
+# if backwards compatibility has been broken,
+# set gmime_binary_age _and_ gmime_interface_age to 0.
+#
+m4_define([gmime_major_version], [2])
+m4_define([gmime_minor_version], [6])
+m4_define([gmime_micro_version], [15])
+m4_define([gmime_interface_age], [15])
+m4_define([gmime_binary_age],
+          [m4_eval(100 * gmime_minor_version + gmime_micro_version)])
+m4_define([gmime_version],
+          [gmime_major_version.gmime_minor_version.gmime_micro_version])
+
+# the API version is the major.minor since the last API breakage
+m4_define([gmime_api_major], [2])
+m4_define([gmime_api_minor], [6])
+m4_define([gmime_api_version], [gmime_api_major.gmime_api_minor])
+
+# libtool version related macros
+m4_define([gmime_lt_release], [gmime_major_version.gmime_minor_version])
+m4_define([gmime_lt_current],
+          [m4_eval(100 * gmime_minor_version + gmime_micro_version - gmime_interface_age)])
+m4_define([gmime_lt_revision], [gmime_interface_age])
+m4_define([gmime_lt_age], [m4_eval(gmime_binary_age - gmime_interface_age)])
+m4_define([gmime_lt_current_minus_age],
+          [m4_eval(gmime_lt_current - gmime_lt_age)])
+
+# if the minor version number is odd, then we want debugging.  Otherwise
+# we only want minimal debugging support.
+m4_define([gmime_debug_default],
+          [m4_if(m4_eval(gmime_minor_version % 2), [1], [yes], [minimum])])
+
+
+AC_INIT(gmime, [gmime_version],
+        [http://bugzilla.gnome.org/enter_bug.cgi?product=gmime])
+
+AC_CONFIG_SRCDIR([README])
+AC_CONFIG_MACRO_DIR([m4])
+AC_CANONICAL_SYSTEM
+AC_CANONICAL_HOST
+
+# Save this value here, since automake will set cflags later
+cflags_set=${CFLAGS+set}
+
+AM_INIT_AUTOMAKE([1.9 dist-bzip2 tar-ustar no-dist-gzip foreign])
+AC_SUBST([ACLOCAL_AMFLAGS], ["-I m4 \${ACLOCAL_FLAGS}"])
+dnl m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+AM_CONFIG_HEADER([config.h])
+AM_MAINTAINER_MODE
+
+
+GMIME_MAJOR_VERSION=gmime_major_version
+GMIME_MINOR_VERSION=gmime_minor_version
+GMIME_MICRO_VERSION=gmime_micro_version
+GMIME_INTERFACE_AGE=gmime_interface_age
+GMIME_BINARY_AGE=gmime_binary_age
+GMIME_API_VERSION=gmime_api_version
+GMIME_VERSION=gmime_version
+
+AC_SUBST(GMIME_MAJOR_VERSION)
+AC_SUBST(GMIME_MINOR_VERSION)
+AC_SUBST(GMIME_MICRO_VERSION)
+AC_SUBST(GMIME_API_VERSION)
+AC_SUBST(GMIME_VERSION)
+AC_SUBST(GMIME_INTERFACE_AGE)
+AC_SUBST(GMIME_BINARY_AGE)
+
+AC_DEFINE(GMIME_VERSION, ["gmime_version"],
+	  [Define to the GMime version])
+
+# libtool versioning
+LT_RELEASE=gmime_lt_release
+LT_CURRENT=gmime_lt_current
+LT_REVISION=gmime_lt_revision
+LT_AGE=gmime_lt_age
+LT_CURRENT_MINUS_AGE=gmime_lt_current_minus_age
+AC_SUBST(LT_RELEASE)
+AC_SUBST(LT_CURRENT)
+AC_SUBST(LT_REVISION)
+AC_SUBST(LT_AGE)
+AC_SUBST(LT_CURRENT_MINUS_AGE)
+
+dnl Check for win32 platforms
+AC_MSG_CHECKING([if building for Win32])
+LIB_EXE_MACHINE_FLAG=X86
+case "$host" in
+  *-*-mingw*)
+    platform_win32="yes"
+    native_win32="yes"
+    case "$host" in
+    x86_64-*-*)
+      LIB_EXE_MACHINE_FLAG=X64
+      ;;
+    esac
+    ;;
+  *)
+    platform_win32="no"
+    native_win32="no"
+    ;;
+esac
+
+AC_MSG_RESULT([$platform_win32])
+
+AC_SUBST(LIB_EXE_MACHINE_FLAG)
+
+AM_CONDITIONAL(PLATFORM_WIN32, [test "x$platform_win32" = "xyes"])
+AM_CONDITIONAL(OS_WIN32, test ["$native_win32" = "xyes"])
+AM_CONDITIONAL(OS_WIN32_X64, [test "$LIB_EXE_MACHINE_FLAG" = "X64"])
+
+if test "$glib_native_win32" = "yes"; then
+  AC_CHECK_TOOL(WINDRES, windres, no)
+  if test "$WINDRES" = no; then
+    AC_MSG_ERROR([*** Could not find an implementation of windres in your PATH.])
+  fi
+  AC_CHECK_TOOL(NM, nm, no)
+  if test "$NM" = no; then
+    AC_MSG_ERROR([*** Could not find an implementation of nm in your PATH.])
+  fi
+  AC_CHECK_TOOL(RANLIB, ranlib, :)
+  AC_CHECK_PROG(ms_librarian, [lib.exe], [yes], [no])
+fi
+AM_CONDITIONAL(MS_LIB_AVAILABLE, [test x$ms_librarian = xyes])
+
+dnl Checks for programs.
+AC_ISC_POSIX
+AC_PROG_CC
+AM_PROG_CC_STDC
+AC_C_INLINE
+dnl AC_HEADER_STDC
+AC_STDC_HEADERS
+dnl AC_ARG_PROGRAM
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AC_PATH_PROG(RM, rm, /bin/rm)
+AC_PATH_PROG(MV, mv, /bin/mv)
+AC_PATH_PROG(TAR, tar, /bin/tar)
+
+AC_EXEEXT
+AC_PROG_LIBTOOL
+dnl when using libtool 2.x create libtool early, because it's used in configure
+m4_ifdef([LT_OUTPUT], [LT_OUTPUT])
+DOLT
+
+dnl Checks for header files.
+AC_CHECK_HEADERS(sys/mman.h)
+AC_CHECK_HEADERS(sys/param.h)
+AC_CHECK_HEADERS(winsock2.h)
+AC_CHECK_HEADERS(string.h)
+AC_CHECK_HEADERS(stdlib.h)
+AC_CHECK_HEADERS(netdb.h)
+AC_CHECK_HEADERS(regex.h)
+AC_CHECK_HEADERS(time.h)
+AC_CHECK_HEADERS(poll.h)
+
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+AC_TYPE_SSIZE_T
+AC_TYPE_MODE_T
+
+dnl Check for nfds_t - used by poll()
+AC_MSG_CHECKING(for nfds_t)
+AC_TRY_COMPILE([
+	#include 
+	#include 
+	], [
+	nfds_t nfds = 1;
+	return nfds;
+	]
+,
+	AC_MSG_RESULT(yes)
+,
+	AC_DEFINE(nfds_t, unsigned long int, [Define to `unsigned long int' if  does not define.])
+	AC_MSG_RESULT(no)
+)
+
+dnl Check for some time functions
+AC_CHECK_FUNCS(strftime localtime gmtime_r gmtime_s)
+
+dnl Check for working mmap
+AC_FUNC_MMAP
+AC_CHECK_FUNCS(munmap msync)
+
+dnl Check for select() and poll()
+AC_CHECK_FUNCS(select poll)
+
+dnl ************************************
+dnl Checks for gtk-doc and docbook-tools
+dnl ************************************
+
+GTK_DOC_CHECK([1.8])
+
+AC_PATH_PROGS([DB2HTML], [db2html docbook2html])
+AM_CONDITIONAL(HAVE_DOCBOOK, [test -n "$DB2HTML"])
+
+dnl NOTE: We need to use a separate automake conditional for this
+dnl       to make this work with the tarballs.
+AM_CONDITIONAL(ENABLE_GTK_DOC, test "x$enable_gtk_doc" = "xyes")
+
+dnl Check for profiling options
+AC_ARG_ENABLE([profiling],
+              AC_HELP_STRING([--enable-profiling],
+	      [enable profiling compile flags [[default=no]]]),,
+              [enable_profiling="no"])
+if test "x$enable_profiling" = "xyes"; then
+# CFLAGS="-O0 -g -pg -fprofile-arcs -ftest-coverage"
+  CFLAGS="-O0 -g -pg"
+fi
+
+dnl Enable warning spewage on the console
+AC_ARG_ENABLE([warnings],
+              AC_HELP_STRING([--enable-warnings],
+	      [enable g_warning output when invalid MIME is encountered [[default=no]]]),,
+	      [enable_warnings="no"])
+if test "x$enable_warnings" = "xyes"; then
+  AC_DEFINE(ENABLE_WARNINGS, 1, [Define if GMime should enable warning output.])
+fi
+
+dnl Enable stricter MIME parsing rules
+AC_ARG_ENABLE(strict-parser,
+              AC_HELP_STRING([--enable-strict-parser],
+	      [enable stricter MIME parser rules [[default=no]]]),,
+	      [enable_strict_parser="no"])
+if test "x$enable_strict_parser" = "xyes"; then
+  AC_DEFINE(STRICT_PARSER, 1, [Define if GMime should enable stricter parsing rules.])
+fi
+
+dnl Disable cryptography support
+AC_ARG_ENABLE(cryptography,
+              AC_HELP_STRING([--enable-cryptography],
+	      [enable cryptography support [[default=yes]]]),,
+	      [enable_cryptography="yes"])
+AM_CONDITIONAL(ENABLE_CRYPTOGRAPHY, test "x$enable_cryptography" = "xyes")
+if test "x$enable_cryptography" = "xyes"; then
+  AC_DEFINE(ENABLE_CRYPTOGRAPHY, 1, [Define if cryptography in GMime is enabled.])
+fi
+
+
+dnl We need at *least* glib 2.16.0 for GIO and 2.18.0 for g_set_error_literal
+AM_PATH_GLIB_2_0(2.18.0, ,
+		 AC_MSG_ERROR(Cannot find GLIB: Is pkg-config in your path?),
+		 gobject gmodule gthread gio)
+
+dnl *****************************
+dnl *** Checks for zlib       ***
+dnl *****************************
+AC_CHECK_HEADERS(zlib.h)
+AC_CHECK_LIB(z, inflate, ZLIB="-lz")
+
+dnl Check for libiconv
+AM_ICONV()
+
+CFLAGS_save="$CFLAGS"
+CFLAGS="$CFLAGS -I$srcdir"
+LIBS_save="$LIBS"
+LIBS="$LIBS $LIBICONV"
+
+AC_CACHE_CHECK([preferred charset formats for system iconv], [ac_cv_have_iconv_detect_h], [
+	AC_RUN_IFELSE([AC_LANG_SOURCE([
+		#define CONFIGURE_IN
+		#include "iconv-detect.c"
+		])],
+	[ac_cv_have_iconv_detect_h=yes], [ac_cv_have_iconv_detect_h=no],
+	[
+		AC_MSG_RESULT([cannot run test program while cross compiling])
+		AC_MSG_ERROR([Copy target system's iconv-detect.h to . and configure with ac_cv_have_iconv_detect_h=yes])
+	])
+])
+if test "x$ac_cv_have_iconv_detect_h" = xyes; then
+	AC_MSG_RESULT([found])
+	AC_DEFINE(HAVE_ICONV_DETECT_H, 1, [Define to 1 to use auto-detected iconv-friendly charset names.])
+else
+	AC_MSG_RESULT([not found
+	*** The iconv-detect program was unable to determine the
+	*** preferred charset formats recognized by your system
+	*** iconv library. It is suggested that you install a
+	*** working iconv library such as the one found at
+	*** ftp://ftp.gnu.org/pub/gnu/libiconv
+	*** 
+	*** Default charset formats will be used.
+	])
+fi
+
+CFLAGS="$CFLAGS_save"
+LIBS="$LIBS_save"
+
+dnl Check for GNU getopt
+AC_CHECK_HEADER(getopt.h)
+AC_MSG_CHECKING(for GNU getopt_long)
+AC_TRY_LINK([
+	#include 
+	#include 
+	#define _GNU_SOURCE
+	#include 
+	], [
+	return getopt_long (0, NULL, NULL, NULL, NULL);
+	]
+,
+	AC_MSG_RESULT([yes])
+	AC_DEFINE(HAVE_GETOPT_H, 1, [Define to 1 if you have the  header with the GNU `getopt_long' function.])
+	have_getopt="yes"
+,
+	AC_MSG_RESULT([no])
+	have_getopt="no"
+)
+AM_CONDITIONAL(SYSTEM_GETOPT, test "x$have_getopt" = "xyes")
+
+dnl Check for fsync (native win32 doesn't have this)
+AC_MSG_CHECKING(for fsync)
+AC_TRY_LINK([
+	#include 
+	], [
+	fsync(0);
+	]
+,
+	AC_MSG_RESULT(yes)
+	AC_DEFINE(HAVE_FSYNC, 1, [Define to 1 if you have the `fsync' function.])
+,
+	AC_MSG_RESULT(no)
+)
+
+dnl Check for MAXHOSTNAMELEN
+AC_MSG_CHECKING(for MAXHOSTNAMELEN)
+AC_TRY_COMPILE([
+	#include 
+	], [
+	return MAXHOSTNAMELEN;
+	]
+,
+	AC_MSG_RESULT(yes)
+,
+	AC_DEFINE(MAXHOSTNAMELEN, 64, [Define with a value if your  does not define MAXHOSTNAMELEN])
+	AC_MSG_RESULT(no; defined as 64)
+)
+
+dnl Check for domainname member in struct utsname from uname(2)
+AC_MSG_CHECKING(for domainname in struct utsname)
+AC_TRY_COMPILE([
+	#define _GNU_SOURCE
+	#include 
+	], [
+	struct utsname unam;
+		
+	unam.domainname[0] = '\0';
+
+	return unam.domainname[0];
+	],
+	AC_MSG_RESULT(yes)
+   	AC_DEFINE(HAVE_UTSNAME_DOMAINNAME, 1, [Define if struct utsname has a domainname member])
+,
+	AC_MSG_RESULT(no)
+)
+
+dnl Timezone checks
+AC_CACHE_CHECK(for tm_gmtoff in struct tm, ac_cv_struct_tm_gmtoff,
+	AC_TRY_COMPILE([
+		#include 
+		], [
+		struct tm tm;
+		tm.tm_gmtoff = 1;
+		return tm.tm_gmtoff;
+		], ac_cv_struct_tm_gmtoff="yes", ac_cv_struct_tm_gmtoff="no"))
+if test "$ac_cv_struct_tm_gmtoff" = "yes"; then
+	AC_DEFINE(HAVE_TM_GMTOFF, 1, [Define if struct tm has a tm_gmtoff member])
+else
+	AC_CACHE_CHECK(for timezone variable, ac_cv_var_timezone,
+		AC_TRY_COMPILE([
+			#include 
+		], [
+			timezone = 1;
+		], ac_cv_var_timezone="yes", ac_cv_var_timezone="no"))
+	if test "$ac_cv_var_timezone" = "yes"; then
+		AC_DEFINE(HAVE_TIMEZONE, 1, [Define if libc defines a timezone variable])
+		AC_CACHE_CHECK(for altzone variable, ac_cv_var_altzone,
+			AC_TRY_COMPILE([
+				#include 
+			], [
+				altzone = 1;
+			], ac_cv_var_altzone="yes", ac_cv_var_altzone="no"))
+		if test "$ac_cv_var_altzone" = "yes"; then
+			AC_DEFINE(HAVE_ALTZONE, 1, [Define if libc defines an altzone variable])
+		fi
+	else
+		AC_CACHE_CHECK(for _timezone variable, ac_cv_var__timezone,
+			AC_TRY_COMPILE([
+				#include 
+			], [
+				_timezone = 1;
+			], ac_cv_var__timezone="yes", ac_cv_var__timezone="no"))
+		if test "$ac_cv_var__timezone" = "yes"; then
+			AC_DEFINE(HAVE__TIMEZONE, 1, [Define if libc defines a _timezone variable])
+		else
+			AC_ERROR(unable to find a way to determine timezone)
+		fi
+	fi
+fi
+
+dnl *************************************
+dnl *** Checks for large file support ***
+dnl *************************************
+AC_ARG_ENABLE([largefile],
+	      AC_HELP_STRING([--enable-largefile],
+	      [enable support for large files [[default=yes]]]),,
+	      [enable_largefile="yes"])
+if test "x$enable_largefile" != "xno"; then
+    AC_SYS_LARGEFILE
+    AC_CACHE_CHECK([for _LARGEFILE64_SOURCE value needed for large files], ac_cv_largefile64_source,
+    [
+	AC_TRY_COMPILE([
+		#include 
+		#include 
+		#include 
+	],[
+		return open ("__o_largefile", O_CREAT | O_RDWR | O_LARGEFILE, 0644);
+	],[
+		ac_cv_largefile64_source="no"
+	],[
+		AC_TRY_COMPILE([
+			#define _LARGEFILE64_SOURCE
+			#include 
+			#include 
+			#include 
+		],[
+			return open ("__o_largefile", O_CREAT | O_RDWR | O_LARGEFILE, 0644);
+		],[
+			ac_cv_largefile64_source="yes"
+		],[
+			ac_cv_largefile64_source="unknown"
+		])
+	])
+    ])
+    
+    enable_largefile="no"
+    
+    if test "x$ac_cv_largefile64_source" = "xyes"; then
+        LFS_CFLAGS="-D_LARGEFILE64_SOURCE"
+        enable_largefile="yes"
+    elif test "x$ac_cv_largefile64_source" = "xunknown"; then
+        AC_DEFINE(O_LARGEFILE, 0, [Define to 0 if your system does not have the O_LARGEFILE flag])
+    fi
+    
+    if test -n "$ac_cv_sys_large_files" -a "x$ac_cv_sys_large_files" != "xno"; then
+        LFS_CFLAGS="$LFS_CFLAGS -D_LARGE_FILES"
+        enable_largefile="yes"
+    fi
+    
+    if test "x$ac_cv_sys_file_offset_bits" != "xno"; then
+        LFS_CFLAGS="$LFS_CFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
+        enable_largefile="yes"
+    fi
+else
+    LFS_CFLAGS=""
+fi
+AM_CONDITIONAL(ENABLE_LARGEFILE, test "x$enable_largefile" = "xyes")
+
+dnl Check type sizes
+CFLAGS_save="$CFLAGS"
+CFLAGS="$CFLAGS $LFS_CFLAGS"
+AC_CHECK_SIZEOF(ssize_t)
+AC_CHECK_SIZEOF(size_t)
+AC_CHECK_SIZEOF(off_t)
+CFLAGS="$CFLAGS_save"
+
+dnl Check for some network functions
+AC_CHECK_FUNCS(gethostname getdomainname getaddrinfo)
+
+dnl ****************************
+dnl *** Checks for libsocket ***
+dnl ****************************
+LIBSOCKET=""
+AC_CHECK_LIB(socket, getaddrinfo, LIBSOCKET="-lsocket")
+
+dnl *************************
+dnl *** Checks for libnsl ***
+dnl *************************
+LIBNSL=""
+AC_CHECK_LIB(nsl, getaddrinfo, LIBNSL="-lnsl")
+
+dnl ******************************************
+dnl *** Checks for GpgME needed for S/MIME ***
+dnl ******************************************
+AC_ARG_ENABLE([smime], 
+	      AC_HELP_STRING([--enable-smime],
+	      [enable S/MIME support [[default=no]]]),,
+	      [enable_smime="no"])
+
+if test "x$enable_cryptography" != "xyes"; then
+   enable_smime="no"
+fi
+
+if test "x$enable_smime" = "xyes"; then
+   AM_PATH_GPGME_PTHREAD(1.1.6, enable_smime="yes (via GpgME)", enable_smime="no")
+   if test "x$enable_smime" != "xno"; then
+      AC_DEFINE(ENABLE_SMIME, 1, [Define if GMime should enable experimental S/MIME support.])
+   fi
+fi
+
+dnl ****************************
+dnl *** Enable Mono bindings ***
+dnl ****************************
+AC_ARG_ENABLE([mono], 
+	      AC_HELP_STRING([--enable-mono],
+	      [enable Mono bindings [[default=auto]]]),,
+	      [enable_mono="auto"])
+if test "x$enable_mono" != "xno"; then
+	AC_PATH_PROG(CSC, mcs, no)
+	# if we found mcs, make sure it's mono and not something else named
+	# mcs, such as Tru64's /usr/bin/mcs, for manipulating object file
+	# comment sections of eCOFF object files.
+	if test "x$CSC" != "xno"; then
+		AC_MSG_CHECKING([whether $CSC is GNU Mono])
+		$CSC --version > /dev/null 2>&1
+		if test $? -ne 0; then
+			CSC=no
+			AC_MSG_RESULT([no])
+		else
+			AC_MSG_RESULT([yes])
+		fi
+	fi
+else
+	CSC="no"
+fi
+
+if test "x$CSC" = "xno"; then
+	dnl error out if the user has explicitly requested mono bindings
+	if test "x$enable_mono" = "xyes"; then
+		AC_MSG_ERROR([Could not find mcs])
+	fi
+	
+	enable_mono="no"
+	AM_CONDITIONAL(ENABLE_MONO, false)
+else
+	enable_mono="yes"
+	AM_CONDITIONAL(ENABLE_MONO, true)
+fi
+
+if test "x$enable_mono" = "xyes"; then
+	AC_PATH_PROG(GACUTIL, gacutil, no)
+	if test "x$GACUTIL" = "xno"; then
+		AC_MSG_ERROR([Your mono installation doesn't expose gacutil])
+	fi
+	
+	AC_SUBST(CSC)
+	AC_SUBST(GACUTIL)
+	
+	PKG_CHECK_MODULES(GLIB_SHARP, glib-sharp-2.0 >= 2.4.0)
+	AC_SUBST(GLIB_SHARP_LIBS)
+	
+	PKG_CHECK_MODULES(GAPI_TOOLS, gapi-2.0)
+	AC_PATH_PROG(GAPI_CODEGEN, gapi2-codegen, no)
+	if test "x$GAPI_CODEGEN" = "xno"; then
+        	AC_MSG_ERROR([You need to install gtk-sharp2-gapi])
+	fi
+	
+	AC_PATH_PROG(GAPI_FIXUP, gapi2-fixup, no)
+	if test "x$GAPI_FIXUP" = "xno"; then
+        	AC_MSG_ERROR([You need to install gtk-sharp2-gapi])
+	fi
+	
+	AC_PATH_PROG(GAPI_PARSER, gapi2-parser, no)
+	if test "x$GAPI_PARSER" = "xno"; then
+        	AC_MSG_ERROR([You need to install gtk-sharp2-gapi])
+	fi
+	
+	dnl The version should be along the lines of
+	dnl "..0.", where major and minor are
+	dnl the current major and minor gmime versions, and interface count is
+	dnl incremented any time the mono API changes, which should really
+	dnl only happen within development series.
+	MONO_INTERFACE_VERSION=0
+	API_VERSION="$GMIME_MAJOR_VERSION.$GMIME_MINOR_VERSION.0.$MONO_INTERFACE_VERSION"
+	AC_SUBST(API_VERSION)
+fi
+
+AC_ARG_WITH([gacdir], AC_HELP_STRING([--with-gacdir], [Specify the Global Assembly Cache root directory]),
+            [[with_gacdir=$withval]],
+            [[with_gacdir=\${prefix}/lib]])
+gacdir=$with_gacdir
+AC_SUBST(gacdir)
+
+dnl Extra libs
+EXTRA_LIBS="$ZLIB"
+if test "x$LIBSOCKET" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $LIBSOCKET"
+fi
+if test "x$LIBNSL" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $LIBNSL"
+fi
+if test "x$LIBICONV" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $LIBICONV"
+fi
+if test "x$GPGME_PTHREAD_LIBS" != "x"; then
+	EXTRA_LIBS="$EXTRA_LIBS $GPGME_PTHREAD_LIBS"
+fi
+
+CFLAGS="$CFLAGS -fno-strict-aliasing"
+LIBS="$LIBS $EXTRA_LIBS"
+
+AC_SUBST(CFLAGS)
+AC_SUBST(LIBS)
+
+GMIME_CFLAGS="$LFS_CFLAGS $GPGME_PTHREAD_CFLAGS"
+GMIME_LIBDIR="-L${libdir}"
+GMIME_INCLUDEDIR="-I${includedir}/gmime-$GMIME_API_VERSION"
+GMIME_LIBS_PRIVATE="$EXTRA_LIBS"
+GMIME_LIBS="-lgmime-$GMIME_API_VERSION"
+
+AC_SUBST(GMIME_LIBDIR)
+AC_SUBST(GMIME_INCLUDEDIR)
+AC_SUBST(GMIME_LIBS_PRIVATE)
+AC_SUBST(GMIME_CFLAGS)
+AC_SUBST(GMIME_LIBS)
+
+
+AC_OUTPUT(
+Makefile
+m4/Makefile
+build/Makefile
+build/vs2008/Makefile
+build/vs2008/config-win32.h
+build/vs2010/Makefile
+build/vs2010/config-win32.h
+docs/Makefile
+docs/reference/Makefile
+docs/tutorial/Makefile
+util/Makefile
+gmime/Makefile
+gmime/gmime-version.h
+mono/Makefile
+mono/AssemblyInfo.cs
+mono/gmime-sharp.dll.config
+mono/gmime-sharp.pc
+tools/Makefile
+gmime.spec
+gmime.pc
+)
+
+echo "
+
+Configuration:
+
+  Source code location: ${srcdir}
+  Install prefix:       ${prefix}
+  Compiler:             ${CC}
+
+  Profiling enabled:    ${enable_profiling}
+
+  Large file support:   ${enable_largefile}
+  Console warnings:     ${enable_warnings}
+  PGP/MIME support:     ${enable_cryptography}
+  S/MIME support:       ${enable_smime}
+  Strict parser:        ${enable_strict_parser}
+
+  Mono bindings:        ${enable_mono}
+"
diff --git a/depcomp b/depcomp
new file mode 100755
index 0000000..bd0ac08
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,688 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2011-12-04.11; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
+# 2011 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, see .
+
+# 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 .
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to .
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+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
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+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
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+   # This is just like msvc7 but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvc7
+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.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  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.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## 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 "s|.*$object$||" -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.  In older versions, 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.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  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,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$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"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+	       s/^ *//
+	       s/ \\*$//
+	       s/$/:/
+	       p
+	     }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 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.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test "$stat" = 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/	\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/	/
+  G
+  p
+}' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # 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
+  ;;
+
+#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 preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  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)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$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 preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  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 preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # 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
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/docs/Makefile.am b/docs/Makefile.am
new file mode 100644
index 0000000..5f75174
--- /dev/null
+++ b/docs/Makefile.am
@@ -0,0 +1,5 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = reference tutorial
+
+EXTRA_DIST = gtkdocs_fix
diff --git a/docs/Makefile.in b/docs/Makefile.in
new file mode 100644
index 0000000..770bd07
--- /dev/null
+++ b/docs/Makefile.in
@@ -0,0 +1,624 @@
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = docs
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+	html-recursive info-recursive install-data-recursive \
+	install-dvi-recursive install-exec-recursive \
+	install-html-recursive install-info-recursive \
+	install-pdf-recursive install-ps-recursive install-recursive \
+	installcheck-recursive installdirs-recursive pdf-recursive \
+	ps-recursive uninstall-recursive
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
+	$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
+	distdir
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+API_VERSION = @API_VERSION@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CSC = @CSC@
+CYGPATH_W = @CYGPATH_W@
+DB2HTML = @DB2HTML@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOLT_BASH = @DOLT_BASH@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GACUTIL = @GACUTIL@
+GAPI_CODEGEN = @GAPI_CODEGEN@
+GAPI_FIXUP = @GAPI_FIXUP@
+GAPI_PARSER = @GAPI_PARSER@
+GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@
+GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@
+GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@
+GMIME_API_VERSION = @GMIME_API_VERSION@
+GMIME_BINARY_AGE = @GMIME_BINARY_AGE@
+GMIME_CFLAGS = @GMIME_CFLAGS@
+GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@
+GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@
+GMIME_LIBDIR = @GMIME_LIBDIR@
+GMIME_LIBS = @GMIME_LIBS@
+GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@
+GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@
+GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@
+GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@
+GMIME_VERSION = @GMIME_VERSION@
+GOBJECT_QUERY = @GOBJECT_QUERY@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@
+GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTCOMPILE = @LTCOMPILE@
+LTCXXCOMPILE = @LTCXXCOMPILE@
+LTLIBICONV = @LTLIBICONV@
+LTLIBOBJS = @LTLIBOBJS@
+LT_AGE = @LT_AGE@
+LT_CURRENT = @LT_CURRENT@
+LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@
+LT_RELEASE = @LT_RELEASE@
+LT_REVISION = @LT_REVISION@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MV = @MV@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+RM = @RM@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gacdir = @gacdir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+ms_librarian = @ms_librarian@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = reference tutorial
+EXTRA_DIST = gtkdocs_fix
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign docs/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# 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):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	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; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+	@fail= failcom='exit 1'; \
+	for f in x $$MAKEFLAGS; do \
+	  case $$f in \
+	    *=* | --[!k]*);; \
+	    *k*) failcom='fail=yes';; \
+	  esac; \
+	done; \
+	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; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done && test -z "$$fail"
+tags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+	done
+ctags-recursive:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+	done
+
+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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$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_P) "$(distdir)/$$subdir" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        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:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
+	install-am install-strip tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+	all all-am check check-am clean clean-generic clean-libtool \
+	ctags ctags-recursive distclean distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
+	uninstall uninstall-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/docs/gtkdocs_fix b/docs/gtkdocs_fix
new file mode 100755
index 0000000..d13daa6
--- /dev/null
+++ b/docs/gtkdocs_fix
@@ -0,0 +1,11 @@
+#!/usr/bin/perl
+
+# Stupid script to fix look of html files created with sgml2html...
+
+foreach (@ARGV) {
+    print "Fixing... $_\n";
+    system("mv $_ $_.orig");
+    system("sed -e 's///g' -e 's/
/
/g' $_.orig > $_"); + unlink("$_.orig"); +} + diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am new file mode 100644 index 0000000..2d7e0c4 --- /dev/null +++ b/docs/reference/Makefile.am @@ -0,0 +1,83 @@ +## Process this file with automake to produce Makefile.in + +# The name of the module. +DOC_MODULE_VERSION = $(GMIME_MAJOR_VERSION).$(GMIME_MINOR_VERSION) +DOC_MODULE = gmime + +# The top-level SGML file. +DOC_MAIN_SGML_FILE = gmime-docs.sgml + +# The directory containing the source code (if it contains documentation). +DOC_SOURCE_DIR = $(top_srcdir)/gmime + +HTML_DIR = $(datadir)/gtk-doc/html + +# Images to copy into HTML directory +HTML_IMAGES = + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS = --deprecated-guards="GMIME_DISABLE_DEPRECATED" + +# Extra options to pass to gtkdoc-scangobj +SCANGOBJ_OPTIONS=--type-init-func="g_mime_init (0)" + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS = --sgml-mode --output-format=xml --ignore-files=trio + +# CFLAGS and LDFLAGS for compiling scan program. Only needed +# if $(DOC_MODULE).types is non-empty. +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + -I$(top_builddir)/gmime \ + $(GLIB_CFLAGS) + +GTKDOC_LIBS = \ + $(top_builddir)/util/libgmime-util.la \ + $(top_builddir)/gmime/libgmime-$(GMIME_API_VERSION).la \ + $(GLIB_LIBS) + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE) +content_files = \ + building.sgml \ + changes-2.0.sgml \ + changes-2.2.sgml \ + changes-2.4.sgml \ + changes-2.6.sgml \ + compiling.sgml \ + data-wrappers.sgml \ + filters.sgml \ + question_index.sgml \ + resources.sgml \ + streams.sgml \ + tree_index.sgml + +# Used for dependencies +HFILE_GLOB=$(top_srcdir)/gmime/*.h +CFILE_GLOB=$(top_srcdir)/gmime/*.c + +# Header files to ignore when scanning +IGNORE_HFILES = \ + gmime-charset-map-private.h \ + gmime-table-private.h \ + gmime-parse-utils.h \ + gmime-common.h \ + gmime-events.h + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS = + +include $(top_srcdir)/gtk-doc.make + +# Other files to distribute +EXTRA_DIST += \ + $(DOC_MODULE)-docs.sgml \ + gmime.hierarchy + +BUILT_EXTRA_DIST = + +dist-hook-local: $(BUILT_EXTRA_DIST) + files='$(BUILT_EXTRA_DIST)'; \ + for f in $$files; do \ + if test -f $$f; then d=.; else d=$(srcdir); fi; \ + cp $$d/$$f $(distdir) || exit 1; done diff --git a/docs/reference/Makefile.in b/docs/reference/Makefile.in new file mode 100644 index 0000000..c50a170 --- /dev/null +++ b/docs/reference/Makefile.in @@ -0,0 +1,767 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ + +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/gtk-doc.make +subdir = docs/reference +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +API_VERSION = @API_VERSION@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSC = @CSC@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GACUTIL = @GACUTIL@ +GAPI_CODEGEN = @GAPI_CODEGEN@ +GAPI_FIXUP = @GAPI_FIXUP@ +GAPI_PARSER = @GAPI_PARSER@ +GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@ +GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@ +GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = $(datadir)/gtk-doc/html +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TAR = @TAR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gacdir = @gacdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# The name of the module. +DOC_MODULE_VERSION = $(GMIME_MAJOR_VERSION).$(GMIME_MINOR_VERSION) +DOC_MODULE = gmime + +# The top-level SGML file. +DOC_MAIN_SGML_FILE = gmime-docs.sgml + +# The directory containing the source code (if it contains documentation). +DOC_SOURCE_DIR = $(top_srcdir)/gmime + +# Images to copy into HTML directory +HTML_IMAGES = + +# Extra options to supply to gtkdoc-scan +SCAN_OPTIONS = --deprecated-guards="GMIME_DISABLE_DEPRECATED" + +# Extra options to pass to gtkdoc-scangobj +SCANGOBJ_OPTIONS = --type-init-func="g_mime_init (0)" + +# Extra options to supply to gtkdoc-mkdb +MKDB_OPTIONS = --sgml-mode --output-format=xml --ignore-files=trio + +# CFLAGS and LDFLAGS for compiling scan program. Only needed +# if $(DOC_MODULE).types is non-empty. +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_builddir) \ + -I$(top_builddir)/gmime \ + $(GLIB_CFLAGS) + +GTKDOC_LIBS = \ + $(top_builddir)/util/libgmime-util.la \ + $(top_builddir)/gmime/libgmime-$(GMIME_API_VERSION).la \ + $(GLIB_LIBS) + + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE) +content_files = \ + building.sgml \ + changes-2.0.sgml \ + changes-2.2.sgml \ + changes-2.4.sgml \ + changes-2.6.sgml \ + compiling.sgml \ + data-wrappers.sgml \ + filters.sgml \ + question_index.sgml \ + resources.sgml \ + streams.sgml \ + tree_index.sgml + + +# Used for dependencies +HFILE_GLOB = $(top_srcdir)/gmime/*.h +CFILE_GLOB = $(top_srcdir)/gmime/*.c + +# Header files to ignore when scanning +IGNORE_HFILES = \ + gmime-charset-map-private.h \ + gmime-table-private.h \ + gmime-parse-utils.h \ + gmime-common.h \ + gmime-events.h + + +# Extra options to supply to gtkdoc-fixref +FIXXREF_OPTIONS = +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_RUN = +@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_RUN = $(LIBTOOL) --mode=execute + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) +TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE) +SETUP_FILES = \ + $(content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + + +# Other files to distribute +EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) $(DOC_MODULE)-docs.sgml \ + gmime.hierarchy +DOC_STAMPS = setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + tmpl.stamp sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = +@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp +BUILT_EXTRA_DIST = +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/gtk-doc.make $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/reference/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign docs/reference/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; +$(top_srcdir)/gtk-doc.make: + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: check-am +all-am: Makefile all-local +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-local + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic \ + maintainer-clean-local + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-local + +.MAKE: install-am install-strip + +.PHONY: all all-am all-local check check-am clean clean-generic \ + clean-libtool clean-local dist-hook distclean \ + distclean-generic distclean-libtool distclean-local distdir \ + dvi dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-local install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic \ + maintainer-clean-local mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-local + + +@ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +@ENABLE_GTK_DOC_FALSE@all-local: + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +#### setup #### + +setup-build.stamp: + -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + echo ' DOC Preparing build'; \ + files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + test -f $(abs_srcdir)/$$file && \ + cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ + done; \ + fi; \ + test -d $(abs_srcdir)/tmpl && \ + { cp -rp $(abs_srcdir)/tmpl $(abs_builddir)/; \ + chmod -R u+w $(abs_builddir)/tmpl; } \ + fi + @touch setup-build.stamp + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + @echo ' DOC Scanning header files' + @_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + echo " DOC Introspecting gobjects"; \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + @touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### templates #### + +tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + @echo ' DOC Rebuilding template files' + @gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + if test -w $(abs_srcdir) ; then \ + cp -rp $(abs_builddir)/tmpl $(abs_srcdir)/; \ + fi \ + fi + @touch tmpl-build.stamp + +tmpl.stamp: tmpl-build.stamp + @true + +$(srcdir)/tmpl/*.sgml: + @true + +#### xml #### + +sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files) + @echo ' DOC Building XML' + @-chmod -R u+w $(srcdir) + @_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + @touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo ' DOC Building HTML' + @rm -rf html + @mkdir html + @mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + if test -f $(abs_srcdir)/$$file ; then \ + cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + fi; \ + if test -f $(abs_builddir)/$$file ; then \ + cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + fi; \ + done; + @echo ' DOC Fixing cross-references' + @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + @touch html-build.stamp + +#### pdf #### + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo ' DOC Building PDF' + @rm -f $(DOC_MODULE).pdf + @mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + @touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \ + rm -rf tmpl; \ + fi + +maintainer-clean-local: clean + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +@ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: +@ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: +@ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" +@ENABLE_GTK_DOC_FALSE@ @false + +dist-hook: dist-check-gtkdoc dist-hook-local + @mkdir $(distdir)/tmpl + @mkdir $(distdir)/html + @-cp ./tmpl/*.sgml $(distdir)/tmpl + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs + +dist-hook-local: $(BUILT_EXTRA_DIST) + files='$(BUILT_EXTRA_DIST)'; \ + for f in $$files; do \ + if test -f $$f; then d=.; else d=$(srcdir); fi; \ + cp $$d/$$f $(distdir) || exit 1; done + +# 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/docs/reference/building.sgml b/docs/reference/building.sgml new file mode 100644 index 0000000..a53b4e8 --- /dev/null +++ b/docs/reference/building.sgml @@ -0,0 +1,280 @@ + + + Compiling the GMime libraries + 3 + GMime Library + + + Compiling the GMime Libraries + How to compile GMime itself + + + Building GMime on UNIX-like systems + + This chapter covers building and installing GMime on UNIX and + UNIX-like systems such as Linux. Compiling GMime on Microsoft + Windows is not a goal of the project, however if you are able + build on a Microsoft Windows platform, do send me building and + installing instructions and I will add them to this document. + + + Before we get into the details of how to compile GMime, I should + mention that binary packages of GMime prebuilt for your operating + system may be available either from your operating system vendor + or from independent sources such as http://rpmfind.net. If you + can find them, it may be the easiest way of getting started + developing GMime. + + + On UNIX-like systems GMime uses the standard GNU build system, + using autoconf for package + configuration and resolving portability issues, + automake for building makefiles that + comply with the GNU Coding Standards, and + libtool for building shared libraries + on multiple platforms. + + + If you are building GMime from the distributed source packages, + then you won't need these tools installed; the necessary pieces + of the tools are already included in the source packages. But + it's useful to know a bit about how packages that use these + tools work. A source package is distributed as a + tar.gz file which you unpack into a + directory full of the source files as follows: + + + tar -zxvf gmime-2.6.x.tar.gz + + + In the toplevel of the directory that is created, there will be + a shell script called configure which + you then run to take the template makefiles called + Makefile.in in the package and create + makefiles customized for your operating system. The + configure script can be passed various + command line arguments to determine how the package is built and + installed. The most commonly useful argument is the + --prefix argument which specifies where + the package is installed. To install a package into + /opt/gmime you would run configure as: + + + ./configure --prefix=/opt/gmime + + + A full list of options can be found by running + configure with the + --help argument. In general, the defaults + are right and should be trusted. After you've run + configure, you then run the + make command to build the package and install + it. + + + make + make install + + + If you don't have permission to write to the directory you are + installing in, you may have to change to root temporarily before + running make install. A quick way to do this is + to use the su command with the + -c option + (ex. su -c "make install"). Also, if you are + installing in a system directory, on some systems (such as + Linux), you will need to run ldconfig after + make install so that the newly installed + libraries will be found. + + + Several environment variables are useful to pass to set before + running configure. CPPFLAGS contains options to + pass to the C compiler, and is used to tell the compiler where + to look for include files. The LDFLAGS variable + is used in a similar fashion for the linker. Finally the + PKG_CONFIG_PATH environment variable contains + a search path that pkg-config (see below) + uses when looking for a file describing how to compile + programs using different libraries. If you were installing GMime + and it's dependencies into /opt/gmime, you + might want to set these variables as: + + + CPPFLAGS="-I/opt/gmime/include" + LDFLAGS="-L/opt/gmime/lib" + PKG_CONFIG_PATH="/opt/gmime/lib/pkgconfig" + export CPPFLAGS LDFLAGS PKG_CONFIG_PATH + + + You may also need to set the LD_LIBRARY_PATH + environment variable so the systems dynamic linker can find + the newly installed libraries, and the PATH + environment program so that utility binaries installed by + the various libraries will be found. + + + LD_LIBRARY_PATH="/opt/gmime/lib" + PATH="/opt/gmime/bin:$PATH" + export LD_LIBRARY_PATH PATH + + + + Dependencies + + Before you can compile the GMime library, you need to have + various other tools and libraries installed on your + system. The two tools needed during the build process (as + differentiated from the tools used in when creating GMime + mentioned above such as autoconf) + are pkg-config and GNU make. + + + + pkg-config + is a tool for tracking the compilation flags needed for + libraries that are used by the GMime libraries. (For each + library, a small .pc text file is installed in a standard + location that contains the compilation flags needed for that + library along with version number information.) The version + of pkg-config needed to build GMime is + mirrored in the dependencies directory + on the GTK+ FTP + site. + + + + The GMime makefiles will mostly work with different versions + of make, however, there tends to be + a few incompatibilities, so the GMime team recommends + installing GNU + make if you don't already have it on your system + and using it. (It may be called gmake + rather than make.) + + + + + GMime depends on the existance of two (2) libraries: GLib and iconv. + + + + + The GLib library provides core non-graphical functionality + such as high level data types, Unicode manipulation, and + a object and type system to C programs. It is available + from the GTK+ + FTP site. + + + + + The GNU + libiconv library is needed to build GLib and GMime + if your system doesn't already have the + iconv() function for doing conversion + between character encodings. Most modern systems should have + iconv(). + + + + + + Building and testing GMime + + First make sure that you have the necessary external + dependencies installed: pkg-config, GNU make, + and, if necessary, libiconv. To get detailed information about + building these packages, see the documentation provided with the + individual packages. On a newer Linux system, it's quite likely + that you'll have all of these installed already. + + + Then build and install the GMime libraries in the order: + libiconv, GLib, then GMime. For each library, follow the + steps of configure, make, + make install mentioned above. If you're + lucky, this will all go smoothly, and you'll be ready to + start compiling your own GMime + applications. You can test your GMime installation + by running pkg-config --modversion gmime-2.6 + and making sure that it can both find GMime and reports the + correct version. + + + If one of the configure scripts fails or running + make fails, look closely at the error + messages printed; these will often provide useful information + as to what went wrong. When configure + fails, extra information, such as errors that a test compilation + ran into, is found in the file config.log. + Looking at the last couple of hundred lines in this file will + frequently make clear what went wrong. If all else fails, you + can ask for help by emailing me, fejj@gnome.org + + + + Extra Configuration Options + + In addition to the normal options, the + configure script for the GMime library + supports a number of additional arguments. (Command line + arguments for the other GMime libraries are described in + the documentation distributed with those libraries.) + + ./configure--enable-profiling--enable-warnings--enable-mono--enable-gtk-doc--enable-largfile + + + + <systemitem>--enable-profiling</systemitem> + + + Normally GMime will not pass the -pg flag to + gcc when building. This option will enable + the use of that flag thus building profiling information into + the GMime libraries for use with the GNU Profiler, gprof. Odds + are you do not care about this option unless you are either me + or desire to profile GMime and/or your program. + + + + + <systemitem>--enable-warnings</systemitem> + + + This option enables parser warnings about invalid MIME to be + logged to stderr at runtime. Again, it is unlikely you will + care to use this option. + + + + + <systemitem>--enable-mono</systemitem> + + + This option will include the Mono .NET bindings as part of + the build. + + + + + <systemitem>--enable-gtk-doc</systemitem> + + + This option will enable the building of the reference + documentation for GMime (e.g. the html pages you are + reading now). + + + + + <systemitem>--enable-largefile</systemitem> + + + This option will enable large file support (e.g. files larger + than 2GB) on 32bit systems. This flag is enabled by default + starting with GMime 2.4.5. + + + + diff --git a/docs/reference/changes-2.0.sgml b/docs/reference/changes-2.0.sgml new file mode 100644 index 0000000..ede457b --- /dev/null +++ b/docs/reference/changes-2.0.sgml @@ -0,0 +1,136 @@ + + + Changes from 1.0 to 2.0 + 3 + Changes from 1.0 to 2.0 + + + Changes from 1.0 to 2.0 + +Incompatible changes made between version 1.0 and version 2.0 + + + + Incompatible changes from 1.0 to 2.0 + +See also the PORTING document in the toplevel GMime source directory. + + +The major change here is that I've dropped my own base object class +and have replaced it with GObject from glib-2.0. This should be a +pleasant change since you (the developer) will now be able to do many +more things such as setting arbitrary data on all GMime objects. For +additional information about GObject, please see the GObject Reference +Manual at http://developer.gnome.org/doc/API/2.0/gobject/ + + + + +The first thing you need to know is that any function returning a +non-const pointer to any object /must/ be unref'd when you are done +with it. Since all objects in GMime now subclass GObject, you may +safely use g_object_unref() +(GMimeStream's may also be unref'd using +g_mime_stream_unref(), but either way is fine). + +Don't forget that +g_mime_part_get_content_object() returns a +ref-counted GMimeDataWrapper object now, and +so you /must/ unref it when you have finished using it. You must also +remember to unref any GMimeDataWrapper object that you /set/ on a +GMimePart using g_mime_part_set_content_object() +as the GMimePart will now ref the content object that you set on it. + + + + GMimeMultipart is a new class which is to be +used for all multipart MIME parts rather than GMimePart (as in +1.0). There are also some subclasses of GMimeMultipart for other +things. + + + + g_mime_part_[g,s]et_boundary() have been removed +(see above). You must now create a GMimeMultipart object and use +g_mime_multipart_[g,s]et_boundary(). + + + + g_mime_part_add_subpart() has been replaced with +g_mime_multipart_add_part(). + + + + g_mime_part_foreach() has been replaced with +g_mime_multipart_foreach() and/or +g_mime_message_foreach_part(). + + + + g_mime_part_get_subpart_from_content_id() has +been replaced with +g_mime_multipart_get_subpart_from_content_id(). + + + + +Another new class is GMimeMessagePart which +is to be used for all MIME parts containing an rfc822 message. All 1.0 +GMimePart's representing message/rfc822 parts (as well as message/news +parts?) need to be migrated over to be GMimeMessagePart objects. + + + + GMimeMessagePartial is another class meant +for handling the message/partial MIME type. All 1.0 GMimePart's +holding data of this type should be replaced with GMimeMessagePartial +objects. + + + + g_mime_message_write_to_stream() and +g_mime_part_write_to_stream() functions have been +consolidated into a virtual method. Replace calls to these functions +with g_mime_object_write_to_stream(). Note: while +g_mime_part_write_to_stream() and +g_mime_message_write_to_stream() still exist, it +is suggested you migrate to +g_mime_object_write_to_stream(). Same goes for +g_mime_part_to_string() and +g_mime_message_to_string(). + + + + GMimeMessage's structure has changed a +bit. You will not be able to do message->header, +instead you want to do ((GMimeObject *) +message)->header. + + + + g_mime_message_set_message_id() now takes a +message_id argument without the encapsulating < and >'s (it now +just takes the addr-spec portion of the msg-id). + + + + GMimeFilterFrom has changed slightly, you +will want to replace all calls to +g_mime_filter_from_new() with +g_mime_filter_from_new +(GMIME_FILTER_FROM_MODE_DEFAULT) +(GMIME_FILTER_FROM_MODE_DEFAULT is equivalent to (int) 0). + + + + GMimeParser is a brand new class and +gmime-parser.h has had a number of API additions. +g_mime_parser_construct_part() and +g_mime_parser_construct_message() still exist, +however they no longer take a GMimeStream argument. Instead, they take +a GMimeParser object. + + + + + diff --git a/docs/reference/changes-2.2.sgml b/docs/reference/changes-2.2.sgml new file mode 100644 index 0000000..b09f308 --- /dev/null +++ b/docs/reference/changes-2.2.sgml @@ -0,0 +1,80 @@ + + + Changes from 2.0 to 2.2 + 3 + Changes from 2.0 to 2.2 + + + Changes from 2.0 to 2.2 + Incompatible changes made between version 2.0 and version 2.2 + + + Incompatible changes from 2.0 to 2.2 + See also the PORTING document in the toplevel GMime source directory. + There are no incompatible changes between 2.0 and 2.2. + GMime 2.2 is both API and ABI compatible with GMime 2.0 meaning +that any program written for GMime 2.0 will compile fine with GMime +2.2 and any program linked against GMime 2.0's libraries will also +work with GMime 2.2's libraries. + Most of the changes made between 2.0 and 2.2 were internal but there +are a few API changes you should be aware of (as these interfaces will +be deprecated in some future version, probably 3.0). + + + Replacement interfaces from 2.0 to 2.2 + + + +g_mime_utils_8bit_header_decode() has been split +into 2 functions. We now have +g_mime_utils_header_decode_text() and +g_mime_utils_header_decode_phrase(). +g_mime_utils_header_decode_text() no longer +requires encoded-words to be rfc822 atoms. +g_mime_utils_header_decode_phrase() is +still strict in that encoded-words MUST be valid rfc822 atoms. + + + +g_mime_utils_8bit_header_encode() has been +renamed to g_mime_utils_header_encode_text() to +be more clear as to what type of header this is supposed to encode. If +you haven't guessed, this function is for encoding rfc822 'text' +headers (such as Subject). + + + +g_mime_utils_8bit_header_encode_phrase() has been +renamed to g_mime_utils_header_encode_phrase() +mostly for consistancy with the previous 2 changes. + + + +g_mime_charset_name() has been renamed to +g_mime_charset_iconv_name() for clarity. + + + +g_mime_charset_locale_name() has been renamed to +g_mime_locale_charset(). + + + +g_mime_cipher_context_verify() no longer returns +a GMimeCipherValidity, instead it returns a +GMimeSignatureValidity which is far more +useful. Never fear, you may still use the +GMimeCipherValidity APIs for the time being - +they work fine given a GMimeSignatureValidity +structure. + + + +g_mime_multipart_signed_verify() also now returns +a GMimeSignatureValidity structure rather than +a GMimeCipherValidity structure. See changes to +g_mime_cipher_context_verify() for details. + + + + diff --git a/docs/reference/changes-2.4.sgml b/docs/reference/changes-2.4.sgml new file mode 100644 index 0000000..dcb328d --- /dev/null +++ b/docs/reference/changes-2.4.sgml @@ -0,0 +1,57 @@ + + + Changes from 2.2 to 2.4 + 3 + Changes from 2.2 to 2.4 + + + Changes from 2.2 to 2.4 + Changes made between version 2.2 and version 2.4 + + + Changes from 2.2 to 2.4 + GMime 2.4 has had a number of API changes since GMime +2.2. To start, ALL public APIs that used to use off_t in GMime 2.2 now +use gint64 so that the API and ABI do not change based on whether or +not large file support is enabled. + In addition, all of the functions marked as deprecated in +2.0 and 2.2 were removed (usually they had equivalent functionality in +a parent class). + Many functions have also been renamed for better clarity +and/or consistency. For convenience, GMime 2.4 source packages include +a shell-script to aid in porting applications using GMime 2.2 (should +work for most GMime 2.0 applications as well) to the 2.4 API. You can +find this script under the tools/ directory, named +`gmime-port-2-2-to-2-4.sh'. + This script won't fix everything, but it should help quite a +bit. + Beyond that, a few methods have changed in other ways: + + g_mime_cipher_context_sign() + still returns int, but if the value isn't -1 (failure), then it will + represent a GMimeCipherHash that it used for signing. This is + useful, for example, when the requested hash was + GMIME_CIPHER_HASH_DEFAULT. + g_mime_cipher_context_decrypt() + now returns a GMimeSignatureValidty on success and NULL on + failure. This is needed in case the encrypted stream was also + signed. + g_mime_multipart_encrypted_encrypt() + now takes a boolean 'sign' argument to allow the caller to request + encrypting and signing in a single pass. + + Several structs have also been rewritten to subclass GObject like +GMimeContentType and GMimeContentDisposition as well as +InternetAddress and InternetAddressList. + Not only have InternetAddress and InternetAddressList been ported to +GObject, but they have also undergone other design +changes. InternetAddress is now a base class for +InternetAddressMailbox and InternetAddressGroup, meaning that +InternetAddress no longer contains a union for group/addr fields. + All functions that return a GObject have been changed to not add a ref +to the object returned, meaning that it is no longer necessary to call +g_object_unref() on MIME parts returned from functions like +g_mime_message_get_mime_part() or g_mime_multipart_get_part(). This +was done to be more consistent with the Gtk+ API. + + diff --git a/docs/reference/changes-2.6.sgml b/docs/reference/changes-2.6.sgml new file mode 100644 index 0000000..4443e9e --- /dev/null +++ b/docs/reference/changes-2.6.sgml @@ -0,0 +1,65 @@ + + + Changes from 2.4 to 2.6 + 3 + Changes from 2.4 to 2.6 + + + Changes from 2.4 to 2.6 + Changes made between version 2.4 and version 2.6 + + + Changes from 2.4 to 2.6 + After releasing GMime 2.4, it was discovered that +g_mime_stream_length() still returned ssize_t which, on 32bit systems, +meant that the function was useless if the actual stream was larger +than 2GB (which could happen if GMime was built with large file +support). + As I fixed this, I also found some API inconsistencies which I felt I +might as well fix up since I had to break API/ABI compatibility with +2.4 anyway. + Most notable in GMime 2.6 is the lack of GMimeSession which has been +dropped in favor of a much simpler callback +mechanism. GMimeCipherContexts constructors now take a +password_request callback function rather than forcing you to subclass +GMimeSession to get this functionality. + Other API changes include: + + GMimeBestEncoding has been renamed to + GMimeEncodingConstraint + GMimeSignatureValidity has been dropped in favor + of GMimeSignatureList which is simply a collection of + signatures. + + GMimeSigner has been replaced by GMimeSignature + and GMimeCertificate which added a number of new fields and + accessors making it much more complete. + + GMimeCipherContext has been renamed to + GMimeCryptoContext and the method names for this class have also + been renamed in a similar fashion. + + g_mime_crypto_context_encrypt() + now takes a digest algorithm argument which is used when the + 'sign' argument is TRUE. + + g_mime_multipart_encrypted_encrypt() + also now takes a digest algorithm argument which it passes along + to g_mime_crypto_context_encrypt(). + + g_mime_crypto_context_decrypt() + now returns a GMimeDecryptResult which contains a list of + signatures (if signed), a list of recipients that the stream had + been encrypted to, and also the cipher and digest algorithms + used. + + g_mime_multipart_encrypted_decrypt() + no longer caches the decrypted part and also now takes a + GMimeSignatureList** output argument which it sets in place of + having to call + g_mime_multipart_encrypted_get_signature_validity() + afterward. + + + + diff --git a/docs/reference/compiling.sgml b/docs/reference/compiling.sgml new file mode 100644 index 0000000..0449b0a --- /dev/null +++ b/docs/reference/compiling.sgml @@ -0,0 +1,46 @@ + + +Compiling GMime Applications +3 +GMime Library + + + +Compiling GMime Applications + +How to compile your GMime application + + + + +Compiling GMime Applications on UNIX + + +To compile a GMime application, you need to tell the compiler where to +find the GMime header files and libraries. This is done with the +pkg-config utility. + + +The following interactive shell session demonstrates how +pkg-config is used: + +$ pkg-config --cflags gmime-2.4 + -I/usr/include/gmime-2.4 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include +$ pkg-config --libs gmime-2.4 + -L/opt/gnome2/lib -lgmime-2.4 -lnsl -lgobject-2.0 -lglib-2.0 + + + +The simplest way to compile a program is to use the "backticks" +feature of the shell. If you enclose a command in backticks +(not single quotes), then its output will be +substituted into the command line before execution. So to compile +a GTK+ Hello, World, you would type the following: + +$ cc `pkg-config --cflags --libs gmime-2.4` hello.c -o hello + + + + + + diff --git a/docs/reference/data-wrappers.sgml b/docs/reference/data-wrappers.sgml new file mode 100644 index 0000000..103c65e --- /dev/null +++ b/docs/reference/data-wrappers.sgml @@ -0,0 +1,22 @@ + + + GMime Data Wrappers + GMime Library + + + + GMime Data Wrappers + How to use GMime Data Wrappers + + + Overview of Data Wrappers + + Data wrappers are very simple. A GMimeDataWrapper object + contains both a stream and an encoding-type. The encoding-type + (such as GMIME_PART_ENCODING_BASE64) is used by + g_mime_data_wrapper_write_to_stream() in order to decode the data + into its unencoded form. This means that you, the application + programmer, do not need to worry about decoding the content stream + yourself. + + diff --git a/docs/reference/filters.sgml b/docs/reference/filters.sgml new file mode 100644 index 0000000..4d3d2e8 --- /dev/null +++ b/docs/reference/filters.sgml @@ -0,0 +1,53 @@ + + + GMime Stream Filters + GMime Library + + + + GMime Stream Filters + How to use GMime Stream Filters + + + Overview of Filters + Stream filters are an efficient way of converting data from + one format to another. To use a stream filter, you must first + construct a GMimeStreamFilter stream and then add the desired + filters to it. + + GMime comes equipped with some basic filters such as + GMimeFilterBasic, GMimeFilterCharset, GMimeFilterCRLF, + GMimeFilterFrom and GMimeFilterHTML. + + The GMimeFilterBasic filter is actually a collection of + filters for common transfer encodings used by MIME. So far, it is + able to handle encoding and decoding of base64, quoted-printable + and (x-)uuencode. + + For internationalization support, GMime also includes a + filter for converting between any 2 charsets, + GMimeFilterCharset. With this filter, mail user agents can allow + the user to read the message content in his or her own + charset. + + A common conversion needed for text is CRLF -> LF and LF -> + CRLF which is needed for most (all?) internet protocols. Luckily, + GMime comes equipped with a filter to handle this for you, + GMimeFilterCRLF. You'll notice that GMimeFilterCRLF can also + handle dot-escaping, which is especially useful for SMTP + (rfc821). + + On Unix systems, mail often resides in spools in mbox + format. Mbox uses a line that starts with "From " to delimit + messages which means that message bodies are forbidden to contain + lines starting with "From ". The common way to escape these from + lines in message bodies is to prepend the line with a greater-than + character ('>') producing ">From ". You'll find GMimeFilterFrom + handy when dealing with this. + + The GMimeFilterHTML filter converts a normal text stream + into an html stream. This is especially useful if you are using a + widget such as GtkHTML to display the contents of an email + message. + + diff --git a/docs/reference/gmime-docs.sgml b/docs/reference/gmime-docs.sgml new file mode 100644 index 0000000..c60ee89 --- /dev/null +++ b/docs/reference/gmime-docs.sgml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + GMime 2.6 Reference Manual + + + Jeffrey + Stedfast + +
+ fejj@gnome.org +
+
+
+
+ + 2000-2011 + Jeffrey Stedfast + + + + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + + + + This manual documents the interfaces of the GMime + library and has some short notes to help get you up to speed + with using the library. + +
+ + + GMime Overview + + +GMime is a powerful MIME (Multipurpose Internet Mail Extension) +utility library. It is meant for creating, editing, and parsing MIME +messages and structures. GMime is released under the 2.1 version of +the GNU Lesser General Public License. GMime is based on GLib 2.0's +GObject system allowing for a lot of flexibility. + + +GMime depends on the following libraries: + + + GLib + + +A general-purpose utility library, not specific to graphical user interfaces. +GLib provides many useful data types, macros, type conversions, +string utilities, file utilities, a main loop abstraction, and so on. + + + + + + + &gmime-Building; + &gmime-Compiling; + &gmime-Changes-2-0; + &gmime-Changes-2-2; + &gmime-Changes-2-4; + &gmime-Changes-2-6; + &gmime-Resources; + &gmime-Questions; + + + + GMime Fundamentals + &gmime-Streams; + &gmime-Filters; + &gmime-DataWrappers; + + + + GMime Core Reference + &gmime-Init; + &gmime-charset; + &gmime-iconv; + &gmime-iconv-utils; + &gmime-encodings; + &gmime-utils; + + + + GMime Classes + + Class hierarchy + &index-Class-Tree; + + + + Streams + &GMimeStream; + &GMimeStreamFile; + &GMimeStreamFs; + &GMimeStreamMem; + &GMimeStreamMmap; + &GMimeStreamNull; + &GMimeStreamFilter; + &GMimeStreamBuffer; + &GMimeStreamPipe; + &GMimeStreamCat; + + + + Stream Filters + &GMimeFilter; + &GMimeFilterBasic; + &GMimeFilterBest; + &GMimeFilterCharset; + &GMimeFilterCRLF; + &GMimeFilterEnriched; + &GMimeFilterFrom; + &GMimeFilterGZip; + &GMimeFilterHTML; + &GMimeFilterMd5; + &GMimeFilterStrip; + &GMimeFilterWindows; + &GMimeFilterYenc; + + + + Data Wrappers + &GMimeDataWrapper; + + + + Message and MIME Headers + &GMimeHeader; + &GMimeContentType; + &GMimeDisposition; + &GMimeParam; + + + + Internet Addresses + &InternetAddress; + &InternetAddressGroup; + &InternetAddressMailbox; + &InternetAddressList; + + + + MIME Messages and Parts + &GMimeObject; + &GMimeMessage; + &GMimePart; + &GMimeMultipart; + &GMimeMultipartEncrypted; + &GMimeMultipartSigned; + &GMimeMessagePart; + &GMimeMessagePartial; + &GMimePartIter; + + + + Parsing Messages and MIME Parts + &GMimeParser; + + + + Cryptography Contexts + &GMimeCertificate; + &GMimeSignature; + &GMimeCryptoContext; + &GMimeGpgContext; + &GMimePkcs7Context; + + +
diff --git a/docs/reference/gmime-overrides.txt b/docs/reference/gmime-overrides.txt new file mode 100644 index 0000000..e69de29 diff --git a/docs/reference/gmime-sections.txt b/docs/reference/gmime-sections.txt new file mode 100644 index 0000000..c771bdd --- /dev/null +++ b/docs/reference/gmime-sections.txt @@ -0,0 +1,1362 @@ +
+gmime +GMIME_MAJOR_VERSION +GMIME_MICRO_VERSION +GMIME_MINOR_VERSION +GMIME_BINARY_AGE +GMIME_INTERFACE_AGE +GMIME_CHECK_VERSION +GMIME_ENABLE_RFC2047_WORKAROUNDS +g_mime_init +g_mime_shutdown +gmime_major_version +gmime_minor_version +gmime_micro_version +gmime_binary_age +gmime_interface_age +g_mime_check_version +
+ +
+gmime-error +GMIME_ERROR +GMIME_ERROR_IS_SYSTEM +
+ +
+gmime-stream +GMimeSeekWhence +GMimeStreamIOVector +GMimeStream +g_mime_stream_construct +g_mime_stream_read +g_mime_stream_write +g_mime_stream_flush +g_mime_stream_seek +g_mime_stream_tell +g_mime_stream_reset +g_mime_stream_eos +g_mime_stream_close +g_mime_stream_length +g_mime_stream_substream +g_mime_stream_set_bounds +g_mime_stream_write_string +g_mime_stream_printf +g_mime_stream_write_to_stream +g_mime_stream_writev + + +g_mime_stream_get_type + + +GMimeStreamClass +GMIME_TYPE_STREAM +GMIME_STREAM +GMIME_IS_STREAM +GMIME_STREAM_CLASS +GMIME_IS_STREAM_CLASS +GMIME_STREAM_GET_CLASS +
+ +
+gmime-stream-buffer +GMimeStreamBufferMode +GMimeStreamBuffer +g_mime_stream_buffer_new +g_mime_stream_buffer_gets +g_mime_stream_buffer_readln + + +g_mime_stream_buffer_get_type + + +GMimeStreamBufferClass +GMIME_TYPE_STREAM_BUFFER +GMIME_STREAM_BUFFER +GMIME_IS_STREAM_BUFFER +GMIME_STREAM_BUFFER_CLASS +GMIME_IS_STREAM_BUFFER_CLASS +GMIME_STREAM_BUFFER_GET_CLASS +
+ +
+gmime-stream-cat +GMimeStreamCat +g_mime_stream_cat_new +g_mime_stream_cat_add_source + + +g_mime_stream_cat_get_type + + +GMimeStreamCatClass +GMIME_TYPE_STREAM_CAT +GMIME_STREAM_CAT +GMIME_IS_STREAM_CAT +GMIME_STREAM_CAT_CLASS +GMIME_IS_STREAM_CAT_CLASS +GMIME_STREAM_CAT_GET_CLASS +
+ +
+gmime-stream-file +GMimeStreamFile +g_mime_stream_file_new +g_mime_stream_file_new_with_bounds +g_mime_stream_file_get_owner +g_mime_stream_file_set_owner + + +g_mime_stream_file_get_type + + +GMimeStreamFileClass +GMIME_TYPE_STREAM_FILE +GMIME_STREAM_FILE +GMIME_IS_STREAM_FILE +GMIME_STREAM_FILE_CLASS +GMIME_IS_STREAM_FILE_CLASS +GMIME_STREAM_FILE_GET_CLASS +
+ +
+gmime-stream-fs +GMimeStreamFs +g_mime_stream_fs_new +g_mime_stream_fs_new_with_bounds +g_mime_stream_fs_get_owner +g_mime_stream_fs_set_owner + + +g_mime_stream_fs_get_type + + +GMimeStreamFsClass +GMIME_TYPE_STREAM_FS +GMIME_STREAM_FS +GMIME_IS_STREAM_FS +GMIME_STREAM_FS_CLASS +GMIME_IS_STREAM_FS_CLASS +GMIME_STREAM_FS_GET_CLASS +
+ +
+gmime-stream-gio +GMimeStreamGIO +g_mime_stream_gio_new +g_mime_stream_gio_new_with_bounds +g_mime_stream_gio_get_owner +g_mime_stream_gio_set_owner + + +g_mime_stream_gio_get_type + + +GMimeStreamGIOClass +GMIME_TYPE_STREAM_GIO +GMIME_STREAM_GIO +GMIME_IS_STREAM_GIO +GMIME_STREAM_GIO_CLASS +GMIME_IS_STREAM_GIO_CLASS +GMIME_STREAM_GIO_GET_CLASS +
+ +
+gmime-stream-mem +GMimeStreamMem +g_mime_stream_mem_new +g_mime_stream_mem_new_with_byte_array +g_mime_stream_mem_new_with_buffer +g_mime_stream_mem_get_byte_array +g_mime_stream_mem_set_byte_array +g_mime_stream_mem_get_owner +g_mime_stream_mem_set_owner + + +g_mime_stream_mem_get_type + + +GMimeStreamMemClass +GMIME_TYPE_STREAM_MEM +GMIME_STREAM_MEM +GMIME_IS_STREAM_MEM +GMIME_STREAM_MEM_CLASS +GMIME_IS_STREAM_MEM_CLASS +GMIME_STREAM_MEM_GET_CLASS +
+ +
+gmime-stream-mmap +GMimeStreamMmap +g_mime_stream_mmap_new +g_mime_stream_mmap_new_with_bounds + + +g_mime_stream_mmap_get_type + + +GMimeStreamMmapClass +GMIME_TYPE_STREAM_MMAP +GMIME_STREAM_MMAP +GMIME_IS_STREAM_MMAP +GMIME_STREAM_MMAP_CLASS +GMIME_IS_STREAM_MMAP_CLASS +GMIME_STREAM_MMAP_GET_CLASS +
+ +
+gmime-stream-null +GMimeStreamNull +g_mime_stream_null_new + + +g_mime_stream_null_get_type + + +GMimeStreamNullClass +GMIME_TYPE_STREAM_NULL +GMIME_STREAM_NULL +GMIME_IS_STREAM_NULL +GMIME_STREAM_NULL_CLASS +GMIME_IS_STREAM_NULL_CLASS +GMIME_STREAM_NULL_GET_CLASS +
+ +
+gmime-stream-pipe +GMimeStreamPipe +g_mime_stream_pipe_new +g_mime_stream_pipe_get_owner +g_mime_stream_pipe_set_owner + + +g_mime_stream_pipe_get_type + + +GMimeStreamPipeClass +GMIME_TYPE_STREAM_PIPE +GMIME_STREAM_PIPE +GMIME_IS_STREAM_PIPE +GMIME_STREAM_PIPE_CLASS +GMIME_IS_STREAM_PIPE_CLASS +GMIME_STREAM_PIPE_GET_CLASS +
+ +
+gmime-stream-filter +GMimeStreamFilter +g_mime_stream_filter_new +g_mime_stream_filter_add +g_mime_stream_filter_remove + + +g_mime_stream_filter_get_type + + +GMimeStreamFilterClass +GMIME_TYPE_STREAM_FILTER +GMIME_STREAM_FILTER +GMIME_IS_STREAM_FILTER +GMIME_STREAM_FILTER_CLASS +GMIME_IS_STREAM_FILTER_CLASS +GMIME_STREAM_FILTER_GET_CLASS +
+ +
+gmime-filter +GMimeFilter +g_mime_filter_copy +g_mime_filter_filter +g_mime_filter_complete +g_mime_filter_reset +g_mime_filter_backup +g_mime_filter_set_size + + +g_mime_filter_get_type + + +GMimeFilterClass +GMIME_TYPE_FILTER +GMIME_FILTER +GMIME_IS_FILTER +GMIME_FILTER_CLASS +GMIME_IS_FILTER_CLASS +GMIME_FILTER_GET_CLASS +
+ +
+gmime-filter-basic +GMimeFilterBasic +g_mime_filter_basic_new + + +g_mime_filter_basic_get_type + + +GMimeFilterBasicClass +GMIME_TYPE_FILTER_BASIC +GMIME_FILTER_BASIC +GMIME_IS_FILTER_BASIC +GMIME_FILTER_BASIC_CLASS +GMIME_IS_FILTER_BASIC_CLASS +GMIME_FILTER_BASIC_GET_CLASS +
+ +
+gmime-filter-best +GMimeFilterBest +GMimeFilterBestFlags +g_mime_filter_best_new +g_mime_filter_best_charset +g_mime_filter_best_encoding + + +g_mime_filter_best_get_type + + +GMimeFilterBestClass +GMIME_TYPE_FILTER_BEST +GMIME_FILTER_BEST +GMIME_IS_FILTER_BEST +GMIME_FILTER_BEST_CLASS +GMIME_IS_FILTER_BEST_CLASS +GMIME_FILTER_BEST_GET_CLASS +
+ +
+gmime-filter-charset +GMimeFilterCharset +g_mime_filter_charset_new + + +g_mime_filter_charset_get_type + + +GMimeFilterCharsetClass +GMIME_TYPE_FILTER_CHARSET +GMIME_FILTER_CHARSET +GMIME_IS_FILTER_CHARSET +GMIME_FILTER_CHARSET_CLASS +GMIME_IS_FILTER_CHARSET_CLASS +GMIME_FILTER_CHARSET_GET_CLASS +
+ +
+gmime-filter-crlf +GMimeFilterCRLF +g_mime_filter_crlf_new + + +g_mime_filter_crlf_get_type + + +GMimeFilterCRLFClass +GMIME_TYPE_FILTER_CRLF +GMIME_FILTER_CRLF +GMIME_IS_FILTER_CRLF +GMIME_FILTER_CRLF_CLASS +GMIME_IS_FILTER_CRLF_CLASS +GMIME_FILTER_CRLF_GET_CLASS +
+ +
+gmime-filter-enriched +GMIME_FILTER_ENRICHED_IS_RICHTEXT +GMimeFilterEnriched +g_mime_filter_enriched_new + + +g_mime_filter_enriched_get_type + + +GMimeFilterEnrichedClass +GMIME_TYPE_FILTER_ENRICHED +GMIME_FILTER_ENRICHED +GMIME_IS_FILTER_ENRICHED +GMIME_FILTER_ENRICHED_CLASS +GMIME_IS_FILTER_ENRICHED_CLASS +GMIME_FILTER_ENRICHED_GET_CLASS +
+ +
+gmime-filter-from +GMimeFilterFrom +GMimeFilterFromMode +g_mime_filter_from_new + + +g_mime_filter_from_get_type + + +GMimeFilterFromClass +GMIME_TYPE_FILTER_FROM +GMIME_FILTER_FROM +GMIME_IS_FILTER_FROM +GMIME_FILTER_FROM_CLASS +GMIME_IS_FILTER_FROM_CLASS +GMIME_FILTER_FROM_GET_CLASS +
+ +
+gmime-filter-gzip +GMimeFilterGZip +GMimeFilterGZipMode +g_mime_filter_gzip_new + + +g_mime_filter_gzip_get_type + + +GMimeFilterGZipClass +GMIME_TYPE_FILTER_GZIP +GMIME_FILTER_GZIP +GMIME_IS_FILTER_GZIP +GMIME_FILTER_GZIP_CLASS +GMIME_IS_FILTER_GZIP_CLASS +GMIME_FILTER_GZIP_GET_CLASS +
+ +
+gmime-filter-html +GMimeFilterHTML +GMIME_FILTER_HTML_PRE +GMIME_FILTER_HTML_CONVERT_NL +GMIME_FILTER_HTML_CONVERT_SPACES +GMIME_FILTER_HTML_CONVERT_URLS +GMIME_FILTER_HTML_MARK_CITATION +GMIME_FILTER_HTML_CONVERT_ADDRESSES +GMIME_FILTER_HTML_ESCAPE_8BIT +GMIME_FILTER_HTML_CITE +g_mime_filter_html_new + + +g_mime_filter_html_get_type + + +GMimeFilterHTMLClass +GMIME_TYPE_FILTER_HTML +GMIME_FILTER_HTML +GMIME_IS_FILTER_HTML +GMIME_FILTER_HTML_CLASS +GMIME_IS_FILTER_HTML_CLASS +GMIME_FILTER_HTML_GET_CLASS +
+ +
+gmime-filter-md5 +GMimeFilterMd5 +g_mime_filter_md5_new +g_mime_filter_md5_get_digest + + +g_mime_filter_md5_get_type + + +GMimeFilterMd5Class +GMIME_TYPE_FILTER_MD5 +GMIME_FILTER_MD5 +GMIME_IS_FILTER_MD5 +GMIME_FILTER_MD5_CLASS +GMIME_IS_FILTER_MD5_CLASS +GMIME_FILTER_MD5_GET_CLASS +
+ +
+gmime-filter-strip +GMimeFilterStrip +g_mime_filter_strip_new + + +g_mime_filter_strip_get_type + + +GMimeFilterStripClass +GMIME_TYPE_FILTER_STRIP +GMIME_FILTER_STRIP +GMIME_IS_FILTER_STRIP +GMIME_FILTER_STRIP_CLASS +GMIME_IS_FILTER_STRIP_CLASS +GMIME_FILTER_STRIP_GET_CLASS +
+ +
+gmime-filter-windows +GMimeFilterWindows +g_mime_filter_windows_new +g_mime_filter_windows_is_windows_charset +g_mime_filter_windows_real_charset + + +g_mime_filter_windows_get_type + + +GMimeFilterWindowsClass +GMIME_TYPE_FILTER_WINDOWS +GMIME_FILTER_WINDOWS +GMIME_IS_FILTER_WINDOWS +GMIME_FILTER_WINDOWS_CLASS +GMIME_IS_FILTER_WINDOWS_CLASS +GMIME_FILTER_WINDOWS_GET_CLASS +
+ +
+gmime-filter-yenc +GMimeFilterYenc +g_mime_filter_yenc_new +g_mime_filter_yenc_set_state +g_mime_filter_yenc_set_crc +g_mime_filter_yenc_get_crc +g_mime_filter_yenc_get_pcrc + + +GMIME_YENCODE_CRC_INIT +GMIME_YENCODE_CRC_FINAL +GMIME_YENCODE_STATE_INIT +GMIME_YDECODE_STATE_INIT +GMIME_YDECODE_STATE_EOLN +GMIME_YDECODE_STATE_ESCAPE +GMIME_YDECODE_STATE_END +GMIME_YDECODE_STATE_BEGIN +GMIME_YDECODE_STATE_DECODE +GMIME_YDECODE_STATE_PART +g_mime_ydecode_step +g_mime_yencode_step +g_mime_yencode_close + + +g_mime_filter_yenc_get_type + + +GMimeFilterYencClass +GMIME_TYPE_FILTER_YENC +GMIME_FILTER_YENC +GMIME_IS_FILTER_YENC +GMIME_FILTER_YENC_CLASS +GMIME_IS_FILTER_YENC_CLASS +GMIME_FILTER_YENC_GET_CLASS +
+ +
+gmime-data-wrapper +GMimeDataWrapper +g_mime_data_wrapper_new +g_mime_data_wrapper_new_with_stream +g_mime_data_wrapper_set_stream +g_mime_data_wrapper_get_stream +g_mime_data_wrapper_set_encoding +g_mime_data_wrapper_get_encoding +g_mime_data_wrapper_write_to_stream + + +g_mime_data_wrapper_get_type + + +GMIME_DATA_WRAPPER +GMIME_IS_DATA_WRAPPER +GMIME_TYPE_DATA_WRAPPER +GMIME_DATA_WRAPPER_CLASS +GMIME_IS_DATA_WRAPPER_CLASS +GMIME_DATA_WRAPPER_GET_CLASS +GMimeDataWrapperClass +
+ +
+gmime-param +GMimeParam +g_mime_param_new +g_mime_param_new_from_string +g_mime_param_destroy +g_mime_param_next +g_mime_param_get_name +g_mime_param_get_value +g_mime_param_append +g_mime_param_append_param +g_mime_param_write_to_string +
+ +
+gmime-header +GMimeHeaderIter +GMimeHeaderList +GMimeHeaderWriter +GMimeHeaderForeachFunc +g_mime_header_iter_new +g_mime_header_iter_free +g_mime_header_iter_copy +g_mime_header_iter_copy_to +g_mime_header_iter_equal +g_mime_header_iter_first +g_mime_header_iter_last +g_mime_header_iter_next +g_mime_header_iter_prev +g_mime_header_iter_is_valid +g_mime_header_iter_get_name +g_mime_header_iter_get_value +g_mime_header_iter_set_value +g_mime_header_iter_remove +g_mime_header_list_new +g_mime_header_list_destroy +g_mime_header_list_clear +g_mime_header_list_contains +g_mime_header_list_prepend +g_mime_header_list_append +g_mime_header_list_remove +g_mime_header_list_set +g_mime_header_list_get +g_mime_header_list_get_iter +g_mime_header_list_foreach +g_mime_header_list_register_writer +g_mime_header_list_write_to_stream +g_mime_header_list_to_string +g_mime_header_list_get_stream +g_mime_header_list_set_stream +
+ +
+gmime-content-type +GMimeContentType +g_mime_content_type_new +g_mime_content_type_new_from_string +g_mime_content_type_to_string +g_mime_content_type_is_type +g_mime_content_type_get_media_type +g_mime_content_type_set_media_type +g_mime_content_type_get_media_subtype +g_mime_content_type_set_media_subtype +g_mime_content_type_get_params +g_mime_content_type_set_params +g_mime_content_type_get_parameter +g_mime_content_type_set_parameter + + +g_mime_content_type_get_type + + +GMIME_CONTENT_TYPE +GMIME_IS_CONTENT_TYPE +GMIME_TYPE_CONTENT_TYPE +GMIME_CONTENT_TYPE_CLASS +GMIME_IS_CONTENT_TYPE_CLASS +GMIME_CONTENT_TYPE_GET_CLASS +GMimeContentTypeClass +
+ +
+gmime-disposition +GMIME_DISPOSITION_ATTACHMENT +GMIME_DISPOSITION_INLINE +GMimeContentDisposition +g_mime_content_disposition_new +g_mime_content_disposition_new_from_string +g_mime_content_disposition_set_disposition +g_mime_content_disposition_get_disposition +g_mime_content_disposition_get_params +g_mime_content_disposition_set_params +g_mime_content_disposition_set_parameter +g_mime_content_disposition_get_parameter +g_mime_content_disposition_to_string + + +g_mime_content_disposition_get_type + + +GMIME_CONTENT_DISPOSITION +GMIME_IS_CONTENT_DISPOSITION +GMIME_TYPE_CONTENT_DISPOSITION +GMIME_CONTENT_DISPOSITION_CLASS +GMIME_IS_CONTENT_DISPOSITION_CLASS +GMIME_CONTENT_DISPOSITION_GET_CLASS +GMimeContentDispositionClass +
+ +
+gmime-object +GMimeObject +GMimeObjectForeachFunc +g_mime_object_register_type +g_mime_object_new +g_mime_object_new_type +g_mime_object_set_content_type +g_mime_object_get_content_type +g_mime_object_set_content_type_parameter +g_mime_object_get_content_type_parameter +g_mime_object_set_disposition +g_mime_object_get_disposition +g_mime_object_set_content_disposition +g_mime_object_get_content_disposition +g_mime_object_set_content_disposition_parameter +g_mime_object_get_content_disposition_parameter +g_mime_object_set_content_id +g_mime_object_get_content_id +g_mime_object_prepend_header +g_mime_object_append_header +g_mime_object_remove_header +g_mime_object_set_header +g_mime_object_get_header +g_mime_object_get_headers +g_mime_object_get_header_list +g_mime_object_write_to_stream +g_mime_object_to_string +g_mime_object_encode + + +g_mime_object_get_type + + +GMIME_OBJECT +GMIME_IS_OBJECT +GMIME_TYPE_OBJECT +GMIME_OBJECT_CLASS +GMIME_IS_OBJECT_CLASS +GMIME_OBJECT_GET_CLASS +GMimeObjectClass +
+ +
+gmime-part +GMimePart +g_mime_part_new +g_mime_part_new_with_type +g_mime_part_set_content_description +g_mime_part_get_content_description +g_mime_part_set_content_id +g_mime_part_get_content_id +g_mime_part_set_content_md5 +g_mime_part_get_content_md5 +g_mime_part_verify_content_md5 +g_mime_part_set_content_location +g_mime_part_get_content_location +g_mime_part_set_content_encoding +g_mime_part_get_content_encoding +g_mime_part_get_best_content_encoding +g_mime_part_set_filename +g_mime_part_get_filename +g_mime_part_get_content_object +g_mime_part_set_content_object + + +g_mime_part_get_type + + +GMIME_PART +GMIME_IS_PART +GMIME_TYPE_PART +GMIME_PART_CLASS +GMIME_IS_PART_CLASS +GMIME_PART_GET_CLASS +GMimePartClass +
+ +
+gmime-part-iter +GMimePartIter +g_mime_part_iter_new +g_mime_part_iter_free +g_mime_part_iter_reset +g_mime_part_iter_jump_to +g_mime_part_iter_is_valid +g_mime_part_iter_next +g_mime_part_iter_prev +g_mime_part_iter_get_toplevel +g_mime_part_iter_get_current +g_mime_part_iter_get_parent +g_mime_part_iter_get_path +g_mime_part_iter_replace +g_mime_part_iter_remove +
+ +
+gmime-multipart +GMimeMultipart +g_mime_multipart_new +g_mime_multipart_new_with_subtype +g_mime_multipart_set_preface +g_mime_multipart_get_preface +g_mime_multipart_set_postface +g_mime_multipart_get_postface +g_mime_multipart_set_boundary +g_mime_multipart_get_boundary +g_mime_multipart_get_count +g_mime_multipart_contains +g_mime_multipart_index_of +g_mime_multipart_add +g_mime_multipart_clear +g_mime_multipart_insert +g_mime_multipart_remove +g_mime_multipart_remove_at +g_mime_multipart_replace +g_mime_multipart_get_part +g_mime_multipart_foreach +g_mime_multipart_get_subpart_from_content_id + + +g_mime_multipart_get_type + + +GMIME_MULTIPART +GMIME_IS_MULTIPART +GMIME_TYPE_MULTIPART +GMIME_MULTIPART_CLASS +GMIME_IS_MULTIPART_CLASS +GMIME_MULTIPART_GET_CLASS +GMimeMultipartClass +
+ +
+gmime-multipart-encrypted +GMimeMultipartEncrypted +g_mime_multipart_encrypted_new +g_mime_multipart_encrypted_encrypt +g_mime_multipart_encrypted_decrypt + + +g_mime_multipart_encrypted_get_type + + +GMIME_MULTIPART_ENCRYPTED +GMIME_IS_MULTIPART_ENCRYPTED +GMIME_TYPE_MULTIPART_ENCRYPTED +GMIME_MULTIPART_ENCRYPTED_CLASS +GMIME_IS_MULTIPART_ENCRYPTED_CLASS +GMIME_MULTIPART_ENCRYPTED_GET_CLASS +GMimeMultipartEncryptedClass +
+ +
+gmime-multipart-signed +GMimeMultipartSigned +g_mime_multipart_signed_new +g_mime_multipart_signed_sign +g_mime_multipart_signed_verify + + +g_mime_multipart_signed_get_type + + +GMIME_MULTIPART_SIGNED +GMIME_IS_MULTIPART_SIGNED +GMIME_TYPE_MULTIPART_SIGNED +GMIME_MULTIPART_SIGNED_CLASS +GMIME_IS_MULTIPART_SIGNED_CLASS +GMIME_MULTIPART_SIGNED_GET_CLASS +GMimeMultipartSignedClass +
+ +
+gmime-message +GMimeRecipientType +GMimeMessage +g_mime_message_new +g_mime_message_set_sender +g_mime_message_get_sender +g_mime_message_set_reply_to +g_mime_message_get_reply_to +g_mime_message_add_recipient +g_mime_message_get_recipients +g_mime_message_get_all_recipients +g_mime_message_set_subject +g_mime_message_get_subject +g_mime_message_set_date +g_mime_message_get_date +g_mime_message_set_date_as_string +g_mime_message_get_date_as_string +g_mime_message_set_message_id +g_mime_message_get_message_id +g_mime_message_set_mime_part +g_mime_message_get_mime_part +g_mime_message_foreach +g_mime_message_get_body + + +g_mime_message_get_type + + +GMIME_MESSAGE +GMIME_IS_MESSAGE +GMIME_TYPE_MESSAGE +GMIME_MESSAGE_CLASS +GMIME_IS_MESSAGE_CLASS +GMIME_MESSAGE_GET_CLASS +GMimeMessageClass +
+ +
+gmime-message-part +GMimeMessagePart +g_mime_message_part_new +g_mime_message_part_new_with_message +g_mime_message_part_get_message +g_mime_message_part_set_message + + +g_mime_message_part_get_type + + +GMIME_MESSAGE_PART +GMIME_IS_MESSAGE_PART +GMIME_TYPE_MESSAGE_PART +GMIME_MESSAGE_PART_CLASS +GMIME_IS_MESSAGE_PART_CLASS +GMIME_MESSAGE_PART_GET_CLASS +GMimeMessagePartClass +
+ +
+gmime-message-partial +GMimeMessagePartial +g_mime_message_partial_new +g_mime_message_partial_get_id +g_mime_message_partial_get_number +g_mime_message_partial_get_total +g_mime_message_partial_reconstruct_message +g_mime_message_partial_split_message + + +g_mime_message_partial_get_type + + +GMIME_MESSAGE_PARTIAL +GMIME_IS_MESSAGE_PARTIAL +GMIME_TYPE_MESSAGE_PARTIAL +GMIME_MESSAGE_PARTIAL_CLASS +GMIME_IS_MESSAGE_PARTIAL_CLASS +GMIME_MESSAGE_PARTIAL_GET_CLASS +GMimeMessagePartialClass +
+ +
+gmime-utils +GMimeReferences +g_mime_utils_header_decode_date +g_mime_utils_header_format_date +g_mime_utils_generate_message_id +g_mime_utils_decode_message_id +g_mime_references_get_message_id +g_mime_references_get_next +g_mime_references_decode +g_mime_references_append +g_mime_references_clear +g_mime_references_free +g_mime_utils_header_fold +g_mime_utils_header_printf +g_mime_utils_quote_string +g_mime_utils_unquote_string +g_mime_utils_text_is_8bit +g_mime_utils_best_encoding +g_mime_utils_decode_8bit +g_mime_utils_header_decode_text +g_mime_utils_header_encode_text +g_mime_utils_header_decode_phrase +g_mime_utils_header_encode_phrase +g_mime_utils_structured_header_fold +g_mime_utils_unstructured_header_fold +
+ +
+gmime-encodings +GMimeContentEncoding +g_mime_content_encoding_from_string +g_mime_content_encoding_to_string +GMimeEncodingConstraint +GMimeEncoding +g_mime_encoding_init_encode +g_mime_encoding_init_decode +g_mime_encoding_reset +g_mime_encoding_outlen +g_mime_encoding_step +g_mime_encoding_flush +GMIME_BASE64_ENCODE_LEN +g_mime_encoding_base64_decode_step +g_mime_encoding_base64_encode_step +g_mime_encoding_base64_encode_close +GMIME_UUDECODE_STATE_INIT +GMIME_UUDECODE_STATE_BEGIN +GMIME_UUDECODE_STATE_END +GMIME_UUENCODE_LEN +g_mime_encoding_uudecode_step +g_mime_encoding_uuencode_step +g_mime_encoding_uuencode_close +GMIME_QP_ENCODE_LEN +g_mime_encoding_quoted_decode_step +g_mime_encoding_quoted_encode_step +g_mime_encoding_quoted_encode_close + + +GMIME_UUDECODE_STATE_MASK + +
+ +
+internet-address +InternetAddress +internet_address_get_name +internet_address_set_name +internet_address_to_string + + +internet_address_get_type + + +INTERNET_ADDRESS +IS_INTERNET_ADDRESS +INTERNET_ADDRESS_TYPE +INTERNET_ADDRESS_CLASS +IS_INTERNET_ADDRESS_CLASS +INTERNET_ADDRESS_GET_CLASS +InternetAddressClass +
+ +
+internet-address-group +InternetAddressGroup +internet_address_group_new +internet_address_group_get_members +internet_address_group_set_members +internet_address_group_add_member + + +internet_address_group_get_type + + +INTERNET_ADDRESS_GROUP +INTERNET_ADDRESS_IS_GROUP +INTERNET_ADDRESS_TYPE_GROUP +INTERNET_ADDRESS_GROUP_CLASS +INTERNET_ADDRESS_IS_GROUP_CLASS +InternetAddressGroupClass +
+ +
+internet-address-mailbox +InternetAddressMailbox +internet_address_mailbox_new +internet_address_mailbox_get_addr +internet_address_mailbox_set_addr + + +internet_address_mailbox_get_type + + +INTERNET_ADDRESS_MAILBOX +INTERNET_ADDRESS_IS_MAILBOX +INTERNET_ADDRESS_TYPE_MAILBOX +INTERNET_ADDRESS_MAILBOX_CLASS +INTERNET_ADDRESS_IS_MAILBOX_CLASS +InternetAddressMailboxClass +
+ +
+internet-address-list +InternetAddressList +internet_address_list_new +internet_address_list_length +internet_address_list_clear +internet_address_list_add +internet_address_list_insert +internet_address_list_remove +internet_address_list_remove_at +internet_address_list_contains +internet_address_list_index_of +internet_address_list_get_address +internet_address_list_set_address +internet_address_list_prepend +internet_address_list_append +internet_address_list_to_string +internet_address_list_parse_string +internet_address_list_writer + + +internet_address_list_get_type + + +INTERNET_ADDRESS_LIST +IS_INTERNET_ADDRESS_LIST +INTERNET_ADDRESS_LIST_TYPE +INTERNET_ADDRESS_LIST_CLASS +IS_INTERNET_ADDRESS_LIST_CLASS +InternetAddressListClass +
+ +
+gmime-parser +GMimeParser +GMimeParserHeaderRegexFunc +g_mime_parser_new +g_mime_parser_new_with_stream +g_mime_parser_init_with_stream +g_mime_parser_get_persist_stream +g_mime_parser_set_persist_stream +g_mime_parser_get_scan_from +g_mime_parser_set_scan_from +g_mime_parser_get_respect_content_length +g_mime_parser_set_respect_content_length +g_mime_parser_set_header_regex +g_mime_parser_tell +g_mime_parser_eos +g_mime_parser_construct_part +g_mime_parser_construct_message +g_mime_parser_get_from +g_mime_parser_get_from_offset +g_mime_parser_get_headers_begin +g_mime_parser_get_headers_end + + +g_mime_parser_get_type + + +GMIME_PARSER +GMIME_IS_PARSER +GMIME_TYPE_PARSER +GMIME_PARSER_CLASS +GMIME_IS_PARSER_CLASS +GMIME_PARSER_GET_CLASS +GMimeParserClass +
+ +
+gmime-charset +GMimeCharset +g_mime_charset_map_init +g_mime_charset_map_shutdown +g_mime_locale_charset +g_mime_locale_language +g_mime_charset_language +g_mime_charset_canon_name +g_mime_charset_iconv_name +g_mime_charset_name +g_mime_charset_locale_name +g_mime_charset_iso_to_windows +g_mime_charset_init +g_mime_charset_step +g_mime_charset_best_name +g_mime_charset_best +g_mime_charset_can_encode +g_mime_set_user_charsets +g_mime_user_charsets +
+ +
+gmime-iconv +g_mime_iconv_init +g_mime_iconv_shutdown +g_mime_iconv_open +g_mime_iconv +g_mime_iconv_close +
+ +
+gmime-iconv-utils +g_mime_iconv_strdup +g_mime_iconv_strndup +g_mime_iconv_utf8_to_locale +g_mime_iconv_utf8_to_locale_length +g_mime_iconv_locale_to_utf8 +g_mime_iconv_locale_to_utf8_length +
+ +
+gmime-certificate +GMimePubKeyAlgo +GMimeDigestAlgo +GMimeCertificateTrust +GMimeCertificate +g_mime_certificate_new +g_mime_certificate_get_pubkey_algo +g_mime_certificate_set_pubkey_algo +g_mime_certificate_get_digest_algo +g_mime_certificate_set_digest_algo +g_mime_certificate_get_issuer_serial +g_mime_certificate_set_issuer_serial +g_mime_certificate_get_issuer_name +g_mime_certificate_set_issuer_name +g_mime_certificate_get_fingerprint +g_mime_certificate_set_fingerprint +g_mime_certificate_get_created +g_mime_certificate_set_created +g_mime_certificate_get_expires +g_mime_certificate_set_expires +g_mime_certificate_get_key_id +g_mime_certificate_set_key_id +g_mime_certificate_get_trust +g_mime_certificate_set_trust +g_mime_certificate_get_email +g_mime_certificate_set_email +g_mime_certificate_get_name +g_mime_certificate_set_name + +GMimeCertificateList +g_mime_certificate_list_new +g_mime_certificate_list_length +g_mime_certificate_list_clear +g_mime_certificate_list_add +g_mime_certificate_list_insert +g_mime_certificate_list_remove +g_mime_certificate_list_remove_at +g_mime_certificate_list_contains +g_mime_certificate_list_index_of +g_mime_certificate_list_get_certificate +g_mime_certificate_list_set_certificate + +g_mime_certificate_get_type +g_mime_certificate_list_get_type + + +GMIME_CERTIFICATE +GMIME_IS_CERTIFICATE +GMIME_TYPE_CERTIFICATE +GMIME_CERTIFICATE_CLASS +GMIME_IS_CERTIFICATE_CLASS +GMIME_CERTIFICATE_GET_CLASS +GMimeCertificateClass +GMIME_CERTIFICATE_LIST +GMIME_IS_CERTIFICATE_LIST +GMIME_TYPE_CERTIFICATE_LIST +GMIME_CERTIFICATE_LIST_CLASS +GMIME_IS_CERTIFICATE_LIST_CLASS +GMIME_CERTIFICATE_LIST_GET_CLASS +GMimeCertificateListClass +
+ +
+gmime-signature +GMimeSignatureStatus +GMimeSignatureError +GMimeSignature +g_mime_signature_new +g_mime_signature_get_certificate +g_mime_signature_set_certificate +g_mime_signature_get_status +g_mime_signature_set_status +g_mime_signature_get_errors +g_mime_signature_set_errors +g_mime_signature_get_created +g_mime_signature_set_created +g_mime_signature_get_expires +g_mime_signature_set_expires + +GMimeSignatureList +g_mime_signature_list_new +g_mime_signature_list_length +g_mime_signature_list_clear +g_mime_signature_list_add +g_mime_signature_list_insert +g_mime_signature_list_remove +g_mime_signature_list_remove_at +g_mime_signature_list_contains +g_mime_signature_list_index_of +g_mime_signature_list_get_signature +g_mime_signature_list_set_signature + +g_mime_signature_get_type +g_mime_signature_list_get_type + + +GMIME_SIGNATURE +GMIME_IS_SIGNATURE +GMIME_TYPE_SIGNATURE +GMIME_SIGNATURE_CLASS +GMIME_IS_SIGNATURE_CLASS +GMIME_SIGNATURE_GET_CLASS +GMimeSignatureClass +GMIME_SIGNATURE_LIST +GMIME_IS_SIGNATURE_LIST +GMIME_TYPE_SIGNATURE_LIST +GMIME_SIGNATURE_LIST_CLASS +GMIME_IS_SIGNATURE_LIST_CLASS +GMIME_SIGNATURE_LIST_GET_CLASS +GMimeSignatureListClass +
+ +
+gmime-crypto-context +GMimePasswordRequestFunc +GMimeCryptoContext +g_mime_crypto_context_set_request_password +g_mime_crypto_context_get_signature_protocol +g_mime_crypto_context_get_encryption_protocol +g_mime_crypto_context_get_key_exchange_protocol +g_mime_crypto_context_digest_id +g_mime_crypto_context_digest_name +g_mime_crypto_context_sign +g_mime_crypto_context_verify +g_mime_crypto_context_encrypt +g_mime_crypto_context_decrypt +g_mime_crypto_context_import_keys +g_mime_crypto_context_export_keys + +GMimeCipherAlgo +GMimeDecryptResult +g_mime_decrypt_result_new +g_mime_decrypt_result_get_recipients +g_mime_decrypt_result_set_recipients +g_mime_decrypt_result_get_signatures +g_mime_decrypt_result_set_signatures +g_mime_decrypt_result_get_cipher +g_mime_decrypt_result_set_cipher +g_mime_decrypt_result_get_mdc +g_mime_decrypt_result_set_mdc + +g_mime_crypto_context_get_type +g_mime_decrypt_result_get_type + + +GMIME_CRYPTO_CONTEXT +GMIME_IS_CRYPTO_CONTEXT +GMIME_TYPE_CRYPTO_CONTEXT +GMIME_CRYPTO_CONTEXT_CLASS +GMIME_IS_CRYPTO_CONTEXT_CLASS +GMIME_CRYPTO_CONTEXT_GET_CLASS +GMimeCryptoContextClass +GMIME_DECRYPT_RESULT +GMIME_IS_DECRYPT_RESULT +GMIME_TYPE_DECRYPT_RESULT +GMIME_DECRYPT_RESULT_CLASS +GMIME_IS_DECRYPT_RESULT_CLASS +GMIME_DECRYPT_RESULT_GET_CLASS +GMimeDecryptResultClass +
+ +
+gmime-gpg-context +GMimeGpgContext +g_mime_gpg_context_new +g_mime_gpg_context_get_always_trust +g_mime_gpg_context_set_always_trust +g_mime_gpg_context_get_auto_key_retrieve +g_mime_gpg_context_set_auto_key_retrieve +g_mime_gpg_context_get_use_agent +g_mime_gpg_context_set_use_agent + + +g_mime_gpg_context_get_type + + +GMIME_GPG_CONTEXT +GMIME_IS_GPG_CONTEXT +GMIME_TYPE_GPG_CONTEXT +GMIME_GPG_CONTEXT_CLASS +GMIME_IS_GPG_CONTEXT_CLASS +GMIME_GPG_CONTEXT_GET_CLASS +GMimeGpgContextClass +
+ +
+gmime-pkcs7-context +GMimePkcs7Context +g_mime_pkcs7_context_new +g_mime_pkcs7_context_get_always_trust +g_mime_pkcs7_context_set_always_trust + + +g_mime_pkcs7_context_get_type + + +GMIME_PKCS7_CONTEXT +GMIME_IS_PKCS7_CONTEXT +GMIME_TYPE_PKCS7_CONTEXT +GMIME_PKCS7_CONTEXT_CLASS +GMIME_IS_PKCS7_CONTEXT_CLASS +GMIME_PKCS7_CONTEXT_GET_CLASS +GMimePkcs7ContextClass +
diff --git a/docs/reference/gmime.hierarchy b/docs/reference/gmime.hierarchy new file mode 100644 index 0000000..ed64b5e --- /dev/null +++ b/docs/reference/gmime.hierarchy @@ -0,0 +1,49 @@ +GObject + GMimeObject + GMimeMessage + GMimePart + GMimeMessagePartial + GMimeMultipart + GMimeMultipartEncrypted + GMimeMultipartSigned + GMimeMessagePart + GMimeContentType + GMimeContentDisposition + InternetAddress + InternetAddressGroup + InternetAddressMailbox + InternetAddressList + GMimeCertificate + GMimeCertificateList + GMimeSignature + GMimeSignatureList + GMimeCryptoContext + GMimeGpgContext + GMimePkcs7Context + GMimeDataWrapper + GMimeFilter + GMimeFilterBasic + GMimeFilterBest + GMimeFilterCharset + GMimeFilterCRLF + GMimeFilterEnriched + GMimeFilterFrom + GMimeFilterGZip + GMimeFilterHTML + GMimeFilterMd5 + GMimeFilterStrip + GMimeFilterWindows + GMimeFilterYenc + GMimeParser + GMimeStream + GMimeStreamBuffer + GMimeStreamCat + GMimeStreamFile + GMimeStreamFilter + GMimeStreamFs + GMimeStreamMem + GMimeStreamMmap + GMimeStreamNull + GMimeStreamPipe +GInterface + GTypePlugin diff --git a/docs/reference/html/CryptoContexts.html b/docs/reference/html/CryptoContexts.html new file mode 100644 index 0000000..7eef6aa --- /dev/null +++ b/docs/reference/html/CryptoContexts.html @@ -0,0 +1,47 @@ + + + + +Cryptography Contexts + + + + + + + + + + + + + + + + +
+

+Cryptography Contexts

+
+
+GMimeCertificate — Digital certificates +
+
+GMimeSignature — Digital signatures +
+
+GMimeCryptoContext — Encryption/signing contexts +
+
+GMimeGpgContext — GnuPG crypto contexts +
+
+GMimePkcs7Context — PKCS7 crypto contexts +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/DataWrappers.html b/docs/reference/html/DataWrappers.html new file mode 100644 index 0000000..3d67bd1 --- /dev/null +++ b/docs/reference/html/DataWrappers.html @@ -0,0 +1,33 @@ + + + + +Data Wrappers + + + + + + + + + + + + + + + + +
+

+Data Wrappers

+
+GMimeDataWrapper — Content objects +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/Filters.html b/docs/reference/html/Filters.html new file mode 100644 index 0000000..4b61a2e --- /dev/null +++ b/docs/reference/html/Filters.html @@ -0,0 +1,71 @@ + + + + +Stream Filters + + + + + + + + + + + + + + + + +
+

+Stream Filters

+
+
+GMimeFilter — Abstract filter class +
+
+GMimeFilterBasic — Basic transfer encoding filter +
+
+GMimeFilterBest — Determine the best charset/encoding to use for a stream +
+
+GMimeFilterCharset — Charset-conversion filter +
+
+GMimeFilterCRLF — Convert line-endings from LF to CRLF or vise versa +
+
+GMimeFilterEnriched — Convert text/enriched or text/rtf to HTML +
+
+GMimeFilterFrom — Escape MBox From_ lines +
+
+GMimeFilterGZip — GNU Zip compression/decompression +
+
+GMimeFilterHTML — Convert plain text into HTML +
+
+GMimeFilterMd5 — Calculate an md5sum +
+
+GMimeFilterStrip — Strip trailing whitespace from the end of lines +
+
+GMimeFilterWindows — Determine if text is in a Microsoft Windows codepage +
+
+GMimeFilterYenc — yEncode or yDecode +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeCertificate.html b/docs/reference/html/GMimeCertificate.html new file mode 100644 index 0000000..07fab4f --- /dev/null +++ b/docs/reference/html/GMimeCertificate.html @@ -0,0 +1,1160 @@ + + + + +GMimeCertificate + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeCertificate

+

GMimeCertificate — Digital certificates

+
+
+

Synopsis

+
enum                GMimePubKeyAlgo;
+enum                GMimeDigestAlgo;
+enum                GMimeCertificateTrust;
+struct              GMimeCertificate;
+GMimeCertificate *  g_mime_certificate_new              (void);
+GMimePubKeyAlgo     g_mime_certificate_get_pubkey_algo  (GMimeCertificate *cert);
+void                g_mime_certificate_set_pubkey_algo  (GMimeCertificate *cert,
+                                                         GMimePubKeyAlgo algo);
+GMimeDigestAlgo     g_mime_certificate_get_digest_algo  (GMimeCertificate *cert);
+void                g_mime_certificate_set_digest_algo  (GMimeCertificate *cert,
+                                                         GMimeDigestAlgo algo);
+const char *        g_mime_certificate_get_issuer_serial
+                                                        (GMimeCertificate *cert);
+void                g_mime_certificate_set_issuer_serial
+                                                        (GMimeCertificate *cert,
+                                                         const char *issuer_serial);
+const char *        g_mime_certificate_get_issuer_name  (GMimeCertificate *cert);
+void                g_mime_certificate_set_issuer_name  (GMimeCertificate *cert,
+                                                         const char *issuer_name);
+const char *        g_mime_certificate_get_fingerprint  (GMimeCertificate *cert);
+void                g_mime_certificate_set_fingerprint  (GMimeCertificate *cert,
+                                                         const char *fingerprint);
+time_t              g_mime_certificate_get_created      (GMimeCertificate *cert);
+void                g_mime_certificate_set_created      (GMimeCertificate *cert,
+                                                         time_t created);
+time_t              g_mime_certificate_get_expires      (GMimeCertificate *cert);
+void                g_mime_certificate_set_expires      (GMimeCertificate *cert,
+                                                         time_t expires);
+const char *        g_mime_certificate_get_key_id       (GMimeCertificate *cert);
+void                g_mime_certificate_set_key_id       (GMimeCertificate *cert,
+                                                         const char *key_id);
+GMimeCertificateTrust g_mime_certificate_get_trust      (GMimeCertificate *cert);
+void                g_mime_certificate_set_trust        (GMimeCertificate *cert,
+                                                         GMimeCertificateTrust trust);
+const char *        g_mime_certificate_get_email        (GMimeCertificate *cert);
+void                g_mime_certificate_set_email        (GMimeCertificate *cert,
+                                                         const char *email);
+const char *        g_mime_certificate_get_name         (GMimeCertificate *cert);
+void                g_mime_certificate_set_name         (GMimeCertificate *cert,
+                                                         const char *name);
+
+struct              GMimeCertificateList;
+GMimeCertificateList * g_mime_certificate_list_new      (void);
+int                 g_mime_certificate_list_length      (GMimeCertificateList *list);
+void                g_mime_certificate_list_clear       (GMimeCertificateList *list);
+int                 g_mime_certificate_list_add         (GMimeCertificateList *list,
+                                                         GMimeCertificate *cert);
+void                g_mime_certificate_list_insert      (GMimeCertificateList *list,
+                                                         int index,
+                                                         GMimeCertificate *cert);
+gboolean            g_mime_certificate_list_remove      (GMimeCertificateList *list,
+                                                         GMimeCertificate *cert);
+gboolean            g_mime_certificate_list_remove_at   (GMimeCertificateList *list,
+                                                         int index);
+gboolean            g_mime_certificate_list_contains    (GMimeCertificateList *list,
+                                                         GMimeCertificate *cert);
+int                 g_mime_certificate_list_index_of    (GMimeCertificateList *list,
+                                                         GMimeCertificate *cert);
+GMimeCertificate *  g_mime_certificate_list_get_certificate
+                                                        (GMimeCertificateList *list,
+                                                         int index);
+void                g_mime_certificate_list_set_certificate
+                                                        (GMimeCertificateList *list,
+                                                         int index,
+                                                         GMimeCertificate *cert);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeCertificate
+
+
+  GObject
+   +----GMimeCertificateList
+
+
+
+

Description

+

+A GMimeCertificate is an object containing useful information about a +digital certificate as used in signing and encrypting data. +

+
+
+

Details

+
+

enum GMimePubKeyAlgo

+
typedef enum {
+	GMIME_PUBKEY_ALGO_DEFAULT  = 0,
+	GMIME_PUBKEY_ALGO_RSA      = 1,
+	GMIME_PUBKEY_ALGO_RSA_E    = 2,
+	GMIME_PUBKEY_ALGO_RSA_S    = 3,
+	GMIME_PUBKEY_ALGO_ELG_E    = 16,
+	GMIME_PUBKEY_ALGO_DSA      = 17,
+	GMIME_PUBKEY_ALGO_ELG      = 20
+} GMimePubKeyAlgo;
+
+

+A public-key algorithm. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_PUBKEY_ALGO_DEFAULT

The default public-key algorithm. +

GMIME_PUBKEY_ALGO_RSA

The RSA algorithm. +

GMIME_PUBKEY_ALGO_RSA_E

An encryption-only RSA algorithm. +

GMIME_PUBKEY_ALGO_RSA_S

A signature-only RSA algorithm. +

GMIME_PUBKEY_ALGO_ELG_E

An encryption-only ElGamal algorithm. +

GMIME_PUBKEY_ALGO_DSA

The DSA algorithm. +

GMIME_PUBKEY_ALGO_ELG

The ElGamal algorithm. +
+
+
+
+

enum GMimeDigestAlgo

+
typedef enum {
+	GMIME_DIGEST_ALGO_DEFAULT     = 0,
+	GMIME_DIGEST_ALGO_MD5         = 1,
+	GMIME_DIGEST_ALGO_SHA1        = 2,
+	GMIME_DIGEST_ALGO_RIPEMD160   = 3,
+	GMIME_DIGEST_ALGO_MD2         = 5,
+	GMIME_DIGEST_ALGO_TIGER192    = 6,
+	GMIME_DIGEST_ALGO_HAVAL5160   = 7,
+	GMIME_DIGEST_ALGO_SHA256      = 8,
+	GMIME_DIGEST_ALGO_SHA384      = 9,
+	GMIME_DIGEST_ALGO_SHA512      = 10,
+	GMIME_DIGEST_ALGO_SHA224      = 11,
+	GMIME_DIGEST_ALGO_MD4         = 301
+} GMimeDigestAlgo;
+
+

+A hash algorithm. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_DIGEST_ALGO_DEFAULT

The default hash algorithm. +

GMIME_DIGEST_ALGO_MD5

The MD5 hash algorithm. +

GMIME_DIGEST_ALGO_SHA1

The SHA-1 hash algorithm. +

GMIME_DIGEST_ALGO_RIPEMD160

The RIPEMD-160 hash algorithm. +

GMIME_DIGEST_ALGO_MD2

The MD2 hash algorithm. +

GMIME_DIGEST_ALGO_TIGER192

The TIGER-192 hash algorithm. +

GMIME_DIGEST_ALGO_HAVAL5160

The HAVAL-5-160 hash algorithm. +

GMIME_DIGEST_ALGO_SHA256

The SHA-256 hash algorithm. +

GMIME_DIGEST_ALGO_SHA384

The SHA-384 hash algorithm. +

GMIME_DIGEST_ALGO_SHA512

The SHA-512 hash algorithm. +

GMIME_DIGEST_ALGO_SHA224

The SHA-224 hash algorithm. +

GMIME_DIGEST_ALGO_MD4

The MD4 hash algorithm. +
+
+
+
+

enum GMimeCertificateTrust

+
typedef enum {
+	GMIME_CERTIFICATE_TRUST_NONE,
+	GMIME_CERTIFICATE_TRUST_NEVER,
+	GMIME_CERTIFICATE_TRUST_UNDEFINED,
+	GMIME_CERTIFICATE_TRUST_MARGINAL,
+	GMIME_CERTIFICATE_TRUST_FULLY,
+	GMIME_CERTIFICATE_TRUST_ULTIMATE
+} GMimeCertificateTrust;
+
+

+The trust value of a certificate. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_CERTIFICATE_TRUST_NONE

No trust assigned. +

GMIME_CERTIFICATE_TRUST_NEVER

Never trust this certificate. +

GMIME_CERTIFICATE_TRUST_UNDEFINED

Undefined trust for this certificate. +

GMIME_CERTIFICATE_TRUST_MARGINAL

Trust this certificate maginally. +

GMIME_CERTIFICATE_TRUST_FULLY

Trust this certificate fully. +

GMIME_CERTIFICATE_TRUST_ULTIMATE

Trust this certificate ultimately. +
+
+
+
+

struct GMimeCertificate

+
struct GMimeCertificate;
+

+An object containing useful information about a certificate. +

+
++ +
+
+
+
+

g_mime_certificate_new ()

+
GMimeCertificate *  g_mime_certificate_new              (void);
+

+Creates a new GMimeCertificate object. +

+
++ + + + +

Returns :

a new GMimeCertificate object.
+
+
+
+

g_mime_certificate_get_pubkey_algo ()

+
GMimePubKeyAlgo     g_mime_certificate_get_pubkey_algo  (GMimeCertificate *cert);
+

+Get the public-key algorithm used by the certificate. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the public-key algorithm used by the certificate or +GMIME_PUBKEY_ALGO_DEFAULT if unspecified.
+
+
+
+

g_mime_certificate_set_pubkey_algo ()

+
void                g_mime_certificate_set_pubkey_algo  (GMimeCertificate *cert,
+                                                         GMimePubKeyAlgo algo);
+

+Set the public-key algorithm used by the certificate. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

algo :

a GMimePubKeyAlgo +
+
+
+
+

g_mime_certificate_get_digest_algo ()

+
GMimeDigestAlgo     g_mime_certificate_get_digest_algo  (GMimeCertificate *cert);
+

+Get the digest algorithm used by the certificate. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the digest algorithm used by the certificate or +GMIME_DIGEST_ALGO_DEFAULT if unspecified.
+
+
+
+

g_mime_certificate_set_digest_algo ()

+
void                g_mime_certificate_set_digest_algo  (GMimeCertificate *cert,
+                                                         GMimeDigestAlgo algo);
+

+Set the digest algorithm used by the certificate. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

algo :

a GMimeDigestAlgo +
+
+
+
+

g_mime_certificate_get_issuer_serial ()

+
const char *        g_mime_certificate_get_issuer_serial
+                                                        (GMimeCertificate *cert);
+

+Get the certificate's issuer serial. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the certificate's issuer serial or NULL if unspecified.
+
+
+
+

g_mime_certificate_set_issuer_serial ()

+
void                g_mime_certificate_set_issuer_serial
+                                                        (GMimeCertificate *cert,
+                                                         const char *issuer_serial);
+

+Set the certificate's issuer serial. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

issuer_serial :

certificate's issuer serial
+
+
+
+

g_mime_certificate_get_issuer_name ()

+
const char *        g_mime_certificate_get_issuer_name  (GMimeCertificate *cert);
+

+Get the certificate's issuer name. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the certificate's issuer name or NULL if unspecified.
+
+
+
+

g_mime_certificate_set_issuer_name ()

+
void                g_mime_certificate_set_issuer_name  (GMimeCertificate *cert,
+                                                         const char *issuer_name);
+

+Set the certificate's issuer name. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

issuer_name :

certificate's issuer name
+
+
+
+

g_mime_certificate_get_fingerprint ()

+
const char *        g_mime_certificate_get_fingerprint  (GMimeCertificate *cert);
+

+Get the certificate's key fingerprint. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the certificate's key fingerprint or NULL if unspecified.
+
+
+
+

g_mime_certificate_set_fingerprint ()

+
void                g_mime_certificate_set_fingerprint  (GMimeCertificate *cert,
+                                                         const char *fingerprint);
+

+Set the certificate's key fingerprint. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

fingerprint :

fingerprint string
+
+
+
+

g_mime_certificate_get_created ()

+
time_t              g_mime_certificate_get_created      (GMimeCertificate *cert);
+

+Get the creation date of the certificate's key. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the creation date of the certificate's key or -1 if unknown.
+
+
+
+

g_mime_certificate_set_created ()

+
void                g_mime_certificate_set_created      (GMimeCertificate *cert,
+                                                         time_t created);
+

+Set the creation date of the certificate's key. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

created :

creation date
+
+
+
+

g_mime_certificate_get_expires ()

+
time_t              g_mime_certificate_get_expires      (GMimeCertificate *cert);
+

+Get the expiration date of the certificate's key. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the expiration date of the certificate's key or -1 if unknown.
+
+
+
+

g_mime_certificate_set_expires ()

+
void                g_mime_certificate_set_expires      (GMimeCertificate *cert,
+                                                         time_t expires);
+

+Set the expiration date of the certificate's key. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

expires :

expiration date
+
+
+
+

g_mime_certificate_get_key_id ()

+
const char *        g_mime_certificate_get_key_id       (GMimeCertificate *cert);
+

+Get the certificate's key id. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the certificate's key id or NULL if unspecified.
+
+
+
+

g_mime_certificate_set_key_id ()

+
void                g_mime_certificate_set_key_id       (GMimeCertificate *cert,
+                                                         const char *key_id);
+

+Set the certificate's key id. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

key_id :

key id
+
+
+
+

g_mime_certificate_get_trust ()

+
GMimeCertificateTrust g_mime_certificate_get_trust      (GMimeCertificate *cert);
+

+Get the certificate trust. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the certificate trust.
+
+
+
+

g_mime_certificate_set_trust ()

+
void                g_mime_certificate_set_trust        (GMimeCertificate *cert,
+                                                         GMimeCertificateTrust trust);
+

+Set the certificate trust. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

trust :

a GMimeCertificateTrust value
+
+
+
+

g_mime_certificate_get_email ()

+
const char *        g_mime_certificate_get_email        (GMimeCertificate *cert);
+

+Get the certificate's email. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the certificate's email or NULL if unspecified.
+
+
+
+

g_mime_certificate_set_email ()

+
void                g_mime_certificate_set_email        (GMimeCertificate *cert,
+                                                         const char *email);
+

+Set the certificate's email. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

email :

certificate's email
+
+
+
+

g_mime_certificate_get_name ()

+
const char *        g_mime_certificate_get_name         (GMimeCertificate *cert);
+

+Get the certificate's name. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

Returns :

the certificate's name or NULL if unspecified.
+
+
+
+

g_mime_certificate_set_name ()

+
void                g_mime_certificate_set_name         (GMimeCertificate *cert,
+                                                         const char *name);
+

+Set the certificate's name. +

+
++ + + + + + + + + + +

cert :

a GMimeCertificate +

name :

certificate's name
+
+
+
+

struct GMimeCertificateList

+
struct GMimeCertificateList;
+

+A collection of GMimeCertificate objects. +

+
++ +
+
+
+
+

g_mime_certificate_list_new ()

+
GMimeCertificateList * g_mime_certificate_list_new      (void);
+

+Creates a new GMimeCertificateList. +

+
++ + + + +

Returns :

a new GMimeCertificateList.
+
+
+
+

g_mime_certificate_list_length ()

+
int                 g_mime_certificate_list_length      (GMimeCertificateList *list);
+

+Gets the length of the list. +

+
++ + + + + + + + + + +

list :

a GMimeCertificateList +

Returns :

the number of GMimeCertificate objects in the list.
+
+
+
+

g_mime_certificate_list_clear ()

+
void                g_mime_certificate_list_clear       (GMimeCertificateList *list);
+

+Clears the list of addresses. +

+
++ + + + +

list :

a GMimeCertificateList +
+
+
+
+

g_mime_certificate_list_add ()

+
int                 g_mime_certificate_list_add         (GMimeCertificateList *list,
+                                                         GMimeCertificate *cert);
+

+Adds a GMimeCertificate to the GMimeCertificateList. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeCertificateList +

cert :

a GMimeCertificate +

Returns :

the index of the added GMimeCertificate.
+
+
+
+

g_mime_certificate_list_insert ()

+
void                g_mime_certificate_list_insert      (GMimeCertificateList *list,
+                                                         int index,
+                                                         GMimeCertificate *cert);
+

+Inserts a GMimeCertificate into the GMimeCertificateList at the specified +index. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeCertificateList +

index :

index to insert at

cert :

a GMimeCertificate +
+
+
+
+

g_mime_certificate_list_remove ()

+
gboolean            g_mime_certificate_list_remove      (GMimeCertificateList *list,
+                                                         GMimeCertificate *cert);
+

+Removes a GMimeCertificate from the GMimeCertificateList. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeCertificateList +

cert :

a GMimeCertificate +

Returns :

+TRUE if the specified GMimeCertificate was removed or FALSE +otherwise.
+
+
+
+

g_mime_certificate_list_remove_at ()

+
gboolean            g_mime_certificate_list_remove_at   (GMimeCertificateList *list,
+                                                         int index);
+

+Removes a GMimeCertificate from the GMimeCertificateList at the specified +index. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeCertificateList +

index :

index to remove

Returns :

+TRUE if an GMimeCertificate was removed or FALSE otherwise.
+
+
+
+

g_mime_certificate_list_contains ()

+
gboolean            g_mime_certificate_list_contains    (GMimeCertificateList *list,
+                                                         GMimeCertificate *cert);
+

+Checks whether or not the specified GMimeCertificate is contained within +the GMimeCertificateList. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeCertificateList +

cert :

a GMimeCertificate +

Returns :

+TRUE if the specified GMimeCertificate is contained within the +specified GMimeCertificateList or FALSE otherwise.
+
+
+
+

g_mime_certificate_list_index_of ()

+
int                 g_mime_certificate_list_index_of    (GMimeCertificateList *list,
+                                                         GMimeCertificate *cert);
+

+Gets the index of the specified GMimeCertificate inside the +GMimeCertificateList. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeCertificateList +

cert :

a GMimeCertificate +

Returns :

the index of the requested GMimeCertificate within the +GMimeCertificateList or -1 if it is not contained within the +GMimeCertificateList.
+
+
+
+

g_mime_certificate_list_get_certificate ()

+
GMimeCertificate *  g_mime_certificate_list_get_certificate
+                                                        (GMimeCertificateList *list,
+                                                         int index);
+

+Gets the GMimeCertificate at the specified index. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeCertificateList +

index :

index of GMimeCertificate to get

Returns :

the GMimeCertificate at the specified index or NULL if +the index is out of range.
+
+
+
+

g_mime_certificate_list_set_certificate ()

+
void                g_mime_certificate_list_set_certificate
+                                                        (GMimeCertificateList *list,
+                                                         int index,
+                                                         GMimeCertificate *cert);
+

+Sets the GMimeCertificate at the specified index to cert. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeCertificateList +

index :

index of GMimeCertificate to set

cert :

a GMimeCertificate +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeContentDisposition.html b/docs/reference/html/GMimeContentDisposition.html new file mode 100644 index 0000000..9f92b6d --- /dev/null +++ b/docs/reference/html/GMimeContentDisposition.html @@ -0,0 +1,338 @@ + + + + +GMimeContentDisposition + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeContentDisposition

+

GMimeContentDisposition — Content-Disposition fields

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeContentDisposition
+
+
+
+

Description

+

+A GMimeContentDisposition represents the pre-parsed contents of a +Content-Disposition header field. +

+
+
+

Details

+
+

GMIME_DISPOSITION_ATTACHMENT

+
#define GMIME_DISPOSITION_ATTACHMENT "attachment"
+
+

+Standard attachment disposition. +

+
+
+
+

GMIME_DISPOSITION_INLINE

+
#define GMIME_DISPOSITION_INLINE     "inline"
+
+

+Standard inline disposition. +

+
+
+
+

struct GMimeContentDisposition

+
struct GMimeContentDisposition;
+

+A data structure representing a Content-Disposition. +

+
++ +
+
+
+
+

g_mime_content_disposition_new ()

+
GMimeContentDisposition * g_mime_content_disposition_new
+                                                        (void);
+

+Creates a new GMimeContentDisposition object. +

+
++ + + + +

Returns :

a new GMimeContentDisposition object.
+
+
+
+

g_mime_content_disposition_new_from_string ()

+
GMimeContentDisposition * g_mime_content_disposition_new_from_string
+                                                        (const char *str);
+

+Creates a new GMimeContentDisposition object. +

+
++ + + + + + + + + + +

str :

Content-Disposition field value or NULL +

Returns :

a new GMimeContentDisposition object.
+
+
+
+

g_mime_content_disposition_set_disposition ()

+
void                g_mime_content_disposition_set_disposition
+                                                        (GMimeContentDisposition *disposition,
+                                                         const char *value);
+

+Sets the disposition to value which may be one of +GMIME_DISPOSITION_ATTACHMENT or GMIME_DISPOSITION_INLINE or, by +your choice, any other string which would indicate how the MIME +part should be displayed by the MUA. +

+
++ + + + + + + + + + +

disposition :

a GMimeContentDisposition object

value :

disposition value
+
+
+
+

g_mime_content_disposition_get_disposition ()

+
const char *        g_mime_content_disposition_get_disposition
+                                                        (GMimeContentDisposition *disposition);
+

+Gets the disposition or NULL on fail. +

+
++ + + + + + + + + + +

disposition :

a GMimeContentDisposition object

Returns :

the disposition string which is probably one of +GMIME_DISPOSITION_ATTACHMENT or GMIME_DISPOSITION_INLINE.
+
+
+
+

g_mime_content_disposition_get_params ()

+
const GMimeParam *  g_mime_content_disposition_get_params
+                                                        (GMimeContentDisposition *disposition);
+

+Gets the Content-Disposition parameter list. +

+
++ + + + + + + + + + +

disposition :

a GMimeContentDisposition object

Returns :

the list of GMimeParam's set on disposition.
+
+
+
+

g_mime_content_disposition_set_params ()

+
void                g_mime_content_disposition_set_params
+                                                        (GMimeContentDisposition *disposition,
+                                                         GMimeParam *params);
+

+Sets the Content-Disposition's parameter list. +

+
++ + + + + + + + + + +

disposition :

a GMimeContentDisposition object

params :

a list of GMimeParam objects
+
+
+
+

g_mime_content_disposition_set_parameter ()

+
void                g_mime_content_disposition_set_parameter
+                                                        (GMimeContentDisposition *disposition,
+                                                         const char *attribute,
+                                                         const char *value);
+

+Sets a parameter on the Content-Disposition. +

+
++ + + + + + + + + + + + + + +

disposition :

a GMimeContentDisposition object

attribute :

parameter name

value :

parameter value
+
+
+
+

g_mime_content_disposition_get_parameter ()

+
const char *        g_mime_content_disposition_get_parameter
+                                                        (GMimeContentDisposition *disposition,
+                                                         const char *attribute);
+

+Gets the value of the parameter attribute, or NULL on fail. +

+
++ + + + + + + + + + + + + + +

disposition :

a GMimeContentDisposition object

attribute :

parameter name

Returns :

the value of the parameter of name attribute.
+
+
+
+

g_mime_content_disposition_to_string ()

+
char *              g_mime_content_disposition_to_string
+                                                        (GMimeContentDisposition *disposition,
+                                                         gboolean fold);
+

+Allocates a string buffer containing the Content-Disposition header +represented by the disposition object disposition. +

+
++ + + + + + + + + + + + + + +

disposition :

a GMimeContentDisposition object

fold :

fold header if needed

Returns :

a string containing the disposition header
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeContentType.html b/docs/reference/html/GMimeContentType.html new file mode 100644 index 0000000..a1c47c9 --- /dev/null +++ b/docs/reference/html/GMimeContentType.html @@ -0,0 +1,389 @@ + + + + +GMimeContentType + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeContentType

+

GMimeContentType — Content-Type fields

+
+
+

Synopsis

+
struct              GMimeContentType;
+GMimeContentType *  g_mime_content_type_new             (const char *type,
+                                                         const char *subtype);
+GMimeContentType *  g_mime_content_type_new_from_string (const char *str);
+char *              g_mime_content_type_to_string       (GMimeContentType *mime_type);
+gboolean            g_mime_content_type_is_type         (GMimeContentType *mime_type,
+                                                         const char *type,
+                                                         const char *subtype);
+const char *        g_mime_content_type_get_media_type  (GMimeContentType *mime_type);
+void                g_mime_content_type_set_media_type  (GMimeContentType *mime_type,
+                                                         const char *type);
+const char *        g_mime_content_type_get_media_subtype
+                                                        (GMimeContentType *mime_type);
+void                g_mime_content_type_set_media_subtype
+                                                        (GMimeContentType *mime_type,
+                                                         const char *subtype);
+const GMimeParam *  g_mime_content_type_get_params      (GMimeContentType *mime_type);
+void                g_mime_content_type_set_params      (GMimeContentType *mime_type,
+                                                         GMimeParam *params);
+const char *        g_mime_content_type_get_parameter   (GMimeContentType *mime_type,
+                                                         const char *attribute);
+void                g_mime_content_type_set_parameter   (GMimeContentType *mime_type,
+                                                         const char *attribute,
+                                                         const char *value);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeContentType
+
+
+
+

Description

+

+A GMimeContentType represents the pre-parsed contents of a +Content-Type header field. +

+
+
+

Details

+
+

struct GMimeContentType

+
struct GMimeContentType;
+

+A data structure representing a Content-Type. +

+
++ +
+
+
+
+

g_mime_content_type_new ()

+
GMimeContentType *  g_mime_content_type_new             (const char *type,
+                                                         const char *subtype);
+

+Creates a Content-Type object with type type and subtype subtype. +

+
++ + + + + + + + + + + + + + +

type :

MIME type (or NULL for "text")

subtype :

MIME subtype (or NULL for "plain")

Returns :

a new GMimeContentType object.
+
+
+
+

g_mime_content_type_new_from_string ()

+
GMimeContentType *  g_mime_content_type_new_from_string (const char *str);
+

+Constructs a new Content-Type object based on the input string. +

+
++ + + + + + + + + + +

str :

input string containing a content-type (and params)

Returns :

a new GMimeContentType object based on the input string.
+
+
+
+

g_mime_content_type_to_string ()

+
char *              g_mime_content_type_to_string       (GMimeContentType *mime_type);
+

+Allocates a string buffer containing the type and subtype defined +by the mime_type. +

+
++ + + + + + + + + + +

mime_type :

a GMimeContentType object

Returns :

an allocated string containing the type and subtype of the +content-type in the format: type/subtype.
+
+
+
+

g_mime_content_type_is_type ()

+
gboolean            g_mime_content_type_is_type         (GMimeContentType *mime_type,
+                                                         const char *type,
+                                                         const char *subtype);
+

+Compares the given type and subtype with that of the given mime +type object. +

+
++ + + + + + + + + + + + + + + + + + +

mime_type :

a GMimeContentType object

type :

MIME type to compare against

subtype :

MIME subtype to compare against

Returns :

TRUE if the MIME types match or FALSE otherwise. You may +use "*" in place of type and/or subtype as a wilcard.
+
+
+
+

g_mime_content_type_get_media_type ()

+
const char *        g_mime_content_type_get_media_type  (GMimeContentType *mime_type);
+

+Gets the Content-Type's media type. +

+
++ + + + + + + + + + +

mime_type :

a GMimeContentType object

Returns :

the Content-Type's media type.
+
+
+
+

g_mime_content_type_set_media_type ()

+
void                g_mime_content_type_set_media_type  (GMimeContentType *mime_type,
+                                                         const char *type);
+

+Sets the Content-Type's media type. +

+
++ + + + + + + + + + +

mime_type :

a GMimeContentType object

type :

media type
+
+
+
+

g_mime_content_type_get_media_subtype ()

+
const char *        g_mime_content_type_get_media_subtype
+                                                        (GMimeContentType *mime_type);
+

+Gets the Content-Type's media sub-type. +

+
++ + + + + + + + + + +

mime_type :

a GMimeContentType object

Returns :

the Content-Type's media sub-type.
+
+
+
+

g_mime_content_type_set_media_subtype ()

+
void                g_mime_content_type_set_media_subtype
+                                                        (GMimeContentType *mime_type,
+                                                         const char *subtype);
+

+Sets the Content-Type's media subtype. +

+
++ + + + + + + + + + +

mime_type :

a GMimeContentType object

subtype :

media subtype
+
+
+
+

g_mime_content_type_get_params ()

+
const GMimeParam *  g_mime_content_type_get_params      (GMimeContentType *mime_type);
+

+Gets the Content-Type's parameter list. +

+
++ + + + + + + + + + +

mime_type :

a GMimeContentType object

Returns :

the Content-Type's parameter list.
+
+
+
+

g_mime_content_type_set_params ()

+
void                g_mime_content_type_set_params      (GMimeContentType *mime_type,
+                                                         GMimeParam *params);
+

+Sets the Content-Type's parameter list. +

+
++ + + + + + + + + + +

mime_type :

a GMimeContentType object

params :

a list of GMimeParam objects
+
+
+
+

g_mime_content_type_get_parameter ()

+
const char *        g_mime_content_type_get_parameter   (GMimeContentType *mime_type,
+                                                         const char *attribute);
+

+Gets the parameter value specified by attribute if it's available. +

+
++ + + + + + + + + + + + + + +

mime_type :

a GMimeContentType object

attribute :

parameter name (aka attribute)

Returns :

a const pointer to the paramer value specified by +attribute or NULL on fail.
+
+
+
+

g_mime_content_type_set_parameter ()

+
void                g_mime_content_type_set_parameter   (GMimeContentType *mime_type,
+                                                         const char *attribute,
+                                                         const char *value);
+

+Sets a parameter on the Content-Type. +

+
++ + + + + + + + + + + + + + +

mime_type :

MIME Content-Type

attribute :

parameter name (aka attribute)

value :

parameter value
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeCryptoContext.html b/docs/reference/html/GMimeCryptoContext.html new file mode 100644 index 0000000..e247f67 --- /dev/null +++ b/docs/reference/html/GMimeCryptoContext.html @@ -0,0 +1,959 @@ + + + + +GMimeCryptoContext + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeCryptoContext

+

GMimeCryptoContext — Encryption/signing contexts

+
+
+

Synopsis

+
gboolean            (*GMimePasswordRequestFunc)         (GMimeCryptoContext *ctx,
+                                                         const char *user_id,
+                                                         const char *prompt_ctx,
+                                                         gboolean reprompt,
+                                                         GMimeStream *response,
+                                                         GError **err);
+struct              GMimeCryptoContext;
+void                g_mime_crypto_context_set_request_password
+                                                        (GMimeCryptoContext *ctx,
+                                                         GMimePasswordRequestFunc request_passwd);
+const char *        g_mime_crypto_context_get_signature_protocol
+                                                        (GMimeCryptoContext *ctx);
+const char *        g_mime_crypto_context_get_encryption_protocol
+                                                        (GMimeCryptoContext *ctx);
+const char *        g_mime_crypto_context_get_key_exchange_protocol
+                                                        (GMimeCryptoContext *ctx);
+GMimeDigestAlgo     g_mime_crypto_context_digest_id     (GMimeCryptoContext *ctx,
+                                                         const char *name);
+const char *        g_mime_crypto_context_digest_name   (GMimeCryptoContext *ctx,
+                                                         GMimeDigestAlgo digest);
+int                 g_mime_crypto_context_sign          (GMimeCryptoContext *ctx,
+                                                         const char *userid,
+                                                         GMimeDigestAlgo digest,
+                                                         GMimeStream *istream,
+                                                         GMimeStream *ostream,
+                                                         GError **err);
+GMimeSignatureList * g_mime_crypto_context_verify       (GMimeCryptoContext *ctx,
+                                                         GMimeDigestAlgo digest,
+                                                         GMimeStream *istream,
+                                                         GMimeStream *sigstream,
+                                                         GError **err);
+int                 g_mime_crypto_context_encrypt       (GMimeCryptoContext *ctx,
+                                                         gboolean sign,
+                                                         const char *userid,
+                                                         GMimeDigestAlgo digest,
+                                                         GPtrArray *recipients,
+                                                         GMimeStream *istream,
+                                                         GMimeStream *ostream,
+                                                         GError **err);
+GMimeDecryptResult * g_mime_crypto_context_decrypt      (GMimeCryptoContext *ctx,
+                                                         GMimeStream *istream,
+                                                         GMimeStream *ostream,
+                                                         GError **err);
+int                 g_mime_crypto_context_import_keys   (GMimeCryptoContext *ctx,
+                                                         GMimeStream *istream,
+                                                         GError **err);
+int                 g_mime_crypto_context_export_keys   (GMimeCryptoContext *ctx,
+                                                         GPtrArray *keys,
+                                                         GMimeStream *ostream,
+                                                         GError **err);
+
+enum                GMimeCipherAlgo;
+struct              GMimeDecryptResult;
+GMimeDecryptResult * g_mime_decrypt_result_new          (void);
+GMimeCertificateList * g_mime_decrypt_result_get_recipients
+                                                        (GMimeDecryptResult *result);
+void                g_mime_decrypt_result_set_recipients
+                                                        (GMimeDecryptResult *result,
+                                                         GMimeCertificateList *recipients);
+GMimeSignatureList * g_mime_decrypt_result_get_signatures
+                                                        (GMimeDecryptResult *result);
+void                g_mime_decrypt_result_set_signatures
+                                                        (GMimeDecryptResult *result,
+                                                         GMimeSignatureList *signatures);
+GMimeCipherAlgo     g_mime_decrypt_result_get_cipher    (GMimeDecryptResult *result);
+void                g_mime_decrypt_result_set_cipher    (GMimeDecryptResult *result,
+                                                         GMimeCipherAlgo cipher);
+GMimeDigestAlgo     g_mime_decrypt_result_get_mdc       (GMimeDecryptResult *result);
+void                g_mime_decrypt_result_set_mdc       (GMimeDecryptResult *result,
+                                                         GMimeDigestAlgo mdc);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeCryptoContext
+         +----GMimeGpgContext
+         +----GMimePkcs7Context
+
+
+
+

Description

+

+A GMimeCryptoContext is used for encrypting, decrypting, signing +and verifying cryptographic signatures. +

+
+
+

Details

+
+

GMimePasswordRequestFunc ()

+
gboolean            (*GMimePasswordRequestFunc)         (GMimeCryptoContext *ctx,
+                                                         const char *user_id,
+                                                         const char *prompt_ctx,
+                                                         gboolean reprompt,
+                                                         GMimeStream *response,
+                                                         GError **err);
+

+A password request callback allowing a GMimeCryptoContext to +prompt the user for a password for a given key. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ctx :

the GMimeCryptoContext making the request

user_id :

the user_id of the password being requested

prompt_ctx :

a string containing some helpful context for the prompt

reprompt :

+TRUE if this password request is a reprompt due to a previously bad password response

response :

a stream for the application to write the password to (followed by a newline '\n' character)

err :

a GError for the callback to set if an error occurs

Returns :

+TRUE on success or FALSE on error.
+
+
+
+

struct GMimeCryptoContext

+
struct GMimeCryptoContext;
+

+A crypto context for use with MIME. +

+
++ +
+
+
+
+

g_mime_crypto_context_set_request_password ()

+
void                g_mime_crypto_context_set_request_password
+                                                        (GMimeCryptoContext *ctx,
+                                                         GMimePasswordRequestFunc request_passwd);
+

+Sets the function used by the ctx for requesting a password from +the user. +

+
++ + + + + + + + + + +

ctx :

a GMimeCryptoContext +

request_passwd :

a callback function for requesting a password
+
+
+
+

g_mime_crypto_context_get_signature_protocol ()

+
const char *        g_mime_crypto_context_get_signature_protocol
+                                                        (GMimeCryptoContext *ctx);
+

+Gets the signature protocol for the crypto context. +

+
++ + + + + + + + + + +

ctx :

a GMimeCryptoContext +

Returns :

the signature protocol or NULL if not supported.
+
+
+
+

g_mime_crypto_context_get_encryption_protocol ()

+
const char *        g_mime_crypto_context_get_encryption_protocol
+                                                        (GMimeCryptoContext *ctx);
+

+Gets the encryption protocol for the crypto context. +

+
++ + + + + + + + + + +

ctx :

a GMimeCryptoContext +

Returns :

the encryption protocol or NULL if not supported.
+
+
+
+

g_mime_crypto_context_get_key_exchange_protocol ()

+
const char *        g_mime_crypto_context_get_key_exchange_protocol
+                                                        (GMimeCryptoContext *ctx);
+

+Gets the key exchange protocol for the crypto context. +

+
++ + + + + + + + + + +

ctx :

a GMimeCryptoContext +

Returns :

the key exchange protocol or NULL if not supported.
+
+
+
+

g_mime_crypto_context_digest_id ()

+
GMimeDigestAlgo     g_mime_crypto_context_digest_id     (GMimeCryptoContext *ctx,
+                                                         const char *name);
+

+Gets the digest id based on the digest name. +

+
++ + + + + + + + + + + + + + +

ctx :

a GMimeCryptoContext +

name :

digest name

Returns :

the equivalent digest id or GMIME_DIGEST_ALGO_DEFAULT on fail.
+
+
+
+

g_mime_crypto_context_digest_name ()

+
const char *        g_mime_crypto_context_digest_name   (GMimeCryptoContext *ctx,
+                                                         GMimeDigestAlgo digest);
+

+Gets the digest name based on the digest id digest. +

+
++ + + + + + + + + + + + + + +

ctx :

a GMimeCryptoContext +

digest :

digest id

Returns :

the equivalent digest name or NULL on fail.
+
+
+
+

g_mime_crypto_context_sign ()

+
int                 g_mime_crypto_context_sign          (GMimeCryptoContext *ctx,
+                                                         const char *userid,
+                                                         GMimeDigestAlgo digest,
+                                                         GMimeStream *istream,
+                                                         GMimeStream *ostream,
+                                                         GError **err);
+

+Signs the input stream and writes the resulting signature to the output stream. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ctx :

a GMimeCryptoContext +

userid :

private key to use to sign the stream

digest :

digest algorithm to use

istream :

input stream

ostream :

output stream

err :

a GError +

Returns :

the GMimeDigestAlgo used on success (useful if digest is +specified as GMIME_DIGEST_ALGO_DEFAULT) or -1 on fail.
+
+
+
+

g_mime_crypto_context_verify ()

+
GMimeSignatureList * g_mime_crypto_context_verify       (GMimeCryptoContext *ctx,
+                                                         GMimeDigestAlgo digest,
+                                                         GMimeStream *istream,
+                                                         GMimeStream *sigstream,
+                                                         GError **err);
+

+Verifies the signature. If istream is a clearsigned stream, +you should pass NULL as the sigstream parameter. Otherwise +sigstream is assumed to be the signature stream and is used to +verify the integirity of the istream. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

ctx :

a GMimeCryptoContext +

digest :

digest algorithm used, if known

istream :

input stream

sigstream :

optional detached-signature stream

err :

a GError +

Returns :

a GMimeSignatureList object containing the status of each +signature or NULL on error.
+
+
+
+

g_mime_crypto_context_encrypt ()

+
int                 g_mime_crypto_context_encrypt       (GMimeCryptoContext *ctx,
+                                                         gboolean sign,
+                                                         const char *userid,
+                                                         GMimeDigestAlgo digest,
+                                                         GPtrArray *recipients,
+                                                         GMimeStream *istream,
+                                                         GMimeStream *ostream,
+                                                         GError **err);
+

+Encrypts (and optionally signs) the cleartext input stream and +writes the resulting ciphertext to the output stream. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

ctx :

a GMimeCryptoContext +

sign :

sign as well as encrypt

userid :

key id (or email address) to use when signing (assuming sign is TRUE)

digest :

digest algorithm to use when signing

recipients :

an array of recipient key ids and/or email addresses

istream :

cleartext input stream

ostream :

ciphertext output stream

err :

a GError +

Returns :

+0 on success or -1 on fail.
+
+
+
+

g_mime_crypto_context_decrypt ()

+
GMimeDecryptResult * g_mime_crypto_context_decrypt      (GMimeCryptoContext *ctx,
+                                                         GMimeStream *istream,
+                                                         GMimeStream *ostream,
+                                                         GError **err);
+

+Decrypts the ciphertext input stream and writes the resulting +cleartext to the output stream. +

+

+If the encrypted input stream was also signed, the returned +GMimeDecryptResult will have a non-NULL list of signatures, each with a +GMimeSignatureStatus (among other details about each signature). +

+

+On success, the returned GMimeDecryptResult will contain a list of +certificates, one for each recipient, that the original encrypted stream +was encrypted to. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

ctx :

a GMimeCryptoContext +

istream :

input/ciphertext stream

ostream :

output/cleartext stream

err :

a GError +

Returns :

a GMimeDecryptResult on success or NULL on error.
+
+
+
+

g_mime_crypto_context_import_keys ()

+
int                 g_mime_crypto_context_import_keys   (GMimeCryptoContext *ctx,
+                                                         GMimeStream *istream,
+                                                         GError **err);
+

+Imports a stream of keys/certificates contained within istream +into the key/certificate database controlled by ctx. +

+
++ + + + + + + + + + + + + + + + + + +

ctx :

a GMimeCryptoContext +

istream :

input stream (containing keys)

err :

a GError +

Returns :

+0 on success or -1 on fail.
+
+
+
+

g_mime_crypto_context_export_keys ()

+
int                 g_mime_crypto_context_export_keys   (GMimeCryptoContext *ctx,
+                                                         GPtrArray *keys,
+                                                         GMimeStream *ostream,
+                                                         GError **err);
+

+Exports the keys/certificates in keys to the stream ostream from +the key/certificate database controlled by ctx. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

ctx :

a GMimeCryptoContext +

keys :

an array of key ids

ostream :

output stream

err :

a GError +

Returns :

+0 on success or -1 on fail.
+
+
+
+

enum GMimeCipherAlgo

+
typedef enum {
+	GMIME_CIPHER_ALGO_DEFAULT     = 0,
+	GMIME_CIPHER_ALGO_IDEA        = 1,
+	GMIME_CIPHER_ALGO_3DES        = 2,
+	GMIME_CIPHER_ALGO_CAST5       = 3,
+	GMIME_CIPHER_ALGO_BLOWFISH    = 4,
+	GMIME_CIPHER_ALGO_AES         = 7,
+	GMIME_CIPHER_ALGO_AES192      = 8,
+	GMIME_CIPHER_ALGO_AES256      = 9,
+	GMIME_CIPHER_ALGO_TWOFISH     = 10,
+	GMIME_CIPHER_ALGO_CAMELLIA128 = 11,
+	GMIME_CIPHER_ALGO_CAMELLIA192 = 12,
+	GMIME_CIPHER_ALGO_CAMELLIA256 = 13
+} GMimeCipherAlgo;
+
+

+A cipher algorithm. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_CIPHER_ALGO_DEFAULT

The default (or unknown) cipher. +

GMIME_CIPHER_ALGO_IDEA

The IDEA cipher. +

GMIME_CIPHER_ALGO_3DES

The 3DES cipher. +

GMIME_CIPHER_ALGO_CAST5

The CAST5 cipher. +

GMIME_CIPHER_ALGO_BLOWFISH

The Blowfish cipher. +

GMIME_CIPHER_ALGO_AES

The AES (aka RIJANDALE) cipher. +

GMIME_CIPHER_ALGO_AES192

The AES-192 cipher. +

GMIME_CIPHER_ALGO_AES256

The AES-256 cipher. +

GMIME_CIPHER_ALGO_TWOFISH

The Twofish cipher. +

GMIME_CIPHER_ALGO_CAMELLIA128

The Camellia-128 cipher. +

GMIME_CIPHER_ALGO_CAMELLIA192

The Camellia-192 cipher. +

GMIME_CIPHER_ALGO_CAMELLIA256

The Camellia-256 cipher. +
+
+
+
+

struct GMimeDecryptResult

+
struct GMimeDecryptResult {
+	GObject parent_object;
+	
+	GMimeCertificateList *recipients;
+	GMimeSignatureList *signatures;
+	GMimeCipherAlgo cipher;
+	GMimeDigestAlgo mdc;
+};
+
+

+An object containing the results from decrypting an encrypted stream. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

GObject parent_object;

parent GObject +

GMimeCertificateList *recipients;

A GMimeCertificateList +

GMimeSignatureList *signatures;

A GMimeSignatureList if signed or NULL otherwise.

GMimeCipherAlgo cipher;

The cipher algorithm used to encrypt the stream.

GMimeDigestAlgo mdc;

The MDC digest algorithm used, if any.
+
+
+
+

g_mime_decrypt_result_new ()

+
GMimeDecryptResult * g_mime_decrypt_result_new          (void);
+

+Creates a new GMimeDecryptResult object. +

+
++ + + + +

Returns :

a new GMimeDecryptResult object.
+
+
+
+

g_mime_decrypt_result_get_recipients ()

+
GMimeCertificateList * g_mime_decrypt_result_get_recipients
+                                                        (GMimeDecryptResult *result);
+

+Gets the list of certificates that the stream had been encrypted to. +

+
++ + + + + + + + + + +

result :

A GMimeDecryptResult +

Returns :

a GMimeCertificateList.
+
+
+
+

g_mime_decrypt_result_set_recipients ()

+
void                g_mime_decrypt_result_set_recipients
+                                                        (GMimeDecryptResult *result,
+                                                         GMimeCertificateList *recipients);
+

+Sets the list of certificates that the stream had been encrypted to. +

+
++ + + + + + + + + + +

result :

A GMimeDecryptResult +

recipients :

A GMimeCertificateList +
+
+
+
+

g_mime_decrypt_result_get_signatures ()

+
GMimeSignatureList * g_mime_decrypt_result_get_signatures
+                                                        (GMimeDecryptResult *result);
+

+Gets a list of signatures if the encrypted stream had also been signed. +

+
++ + + + + + + + + + +

result :

A GMimeDecryptResult +

Returns :

a GMimeSignatureList or NULL if the stream was not signed.
+
+
+
+

g_mime_decrypt_result_set_signatures ()

+
void                g_mime_decrypt_result_set_signatures
+                                                        (GMimeDecryptResult *result,
+                                                         GMimeSignatureList *signatures);
+

+Sets the list of signatures. +

+
++ + + + + + + + + + +

result :

A GMimeDecryptResult +

signatures :

A GMimeSignatureList +
+
+
+
+

g_mime_decrypt_result_get_cipher ()

+
GMimeCipherAlgo     g_mime_decrypt_result_get_cipher    (GMimeDecryptResult *result);
+

+Get the cipher algorithm used. +

+
++ + + + + + + + + + +

result :

a GMimeDecryptResult +

Returns :

the cipher algorithm used.
+
+
+
+

g_mime_decrypt_result_set_cipher ()

+
void                g_mime_decrypt_result_set_cipher    (GMimeDecryptResult *result,
+                                                         GMimeCipherAlgo cipher);
+

+Set the cipher algorithm used. +

+
++ + + + + + + + + + +

result :

a GMimeDecryptResult +

cipher :

a GMimeCipherAlgo +
+
+
+
+

g_mime_decrypt_result_get_mdc ()

+
GMimeDigestAlgo     g_mime_decrypt_result_get_mdc       (GMimeDecryptResult *result);
+

+Get the mdc digest algorithm used. +

+
++ + + + + + + + + + +

result :

a GMimeDecryptResult +

Returns :

the mdc digest algorithm used.
+
+
+
+

g_mime_decrypt_result_set_mdc ()

+
void                g_mime_decrypt_result_set_mdc       (GMimeDecryptResult *result,
+                                                         GMimeDigestAlgo mdc);
+

+Set the mdc digest algorithm used. +

+
++ + + + + + + + + + +

result :

a GMimeDecryptResult +

mdc :

a GMimeDigestAlgo +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeDataWrapper.html b/docs/reference/html/GMimeDataWrapper.html new file mode 100644 index 0000000..16333a5 --- /dev/null +++ b/docs/reference/html/GMimeDataWrapper.html @@ -0,0 +1,263 @@ + + + + +GMimeDataWrapper + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeDataWrapper

+

GMimeDataWrapper — Content objects

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeDataWrapper
+
+
+
+

Description

+

+A GMimeDataWrapper is a wrapper object for a GMimePart's body, +allowing clients to read the content from the backing stream +without having to know whether it is encoded/compressed/etc and not +neding to know how to undo said encoding(s). +

+
+
+

Details

+
+

struct GMimeDataWrapper

+
struct GMimeDataWrapper;
+

+A wrapper for a stream which may be encoded. +

+
++ +
+
+
+
+

g_mime_data_wrapper_new ()

+
GMimeDataWrapper *  g_mime_data_wrapper_new             (void);
+

+Creates a new GMimeDataWrapper object. +

+
++ + + + +

Returns :

a new data wrapper object.
+
+
+
+

g_mime_data_wrapper_new_with_stream ()

+
GMimeDataWrapper *  g_mime_data_wrapper_new_with_stream (GMimeStream *stream,
+                                                         GMimeContentEncoding encoding);
+

+Creates a new GMimeDataWrapper object around stream. +

+
++ + + + + + + + + + + + + + +

stream :

a GMimeStream +

encoding :

stream's encoding

Returns :

a data wrapper around stream. Since the wrapper owns its +own reference on the stream, caller is responsible for unrefing +its own copy.
+
+
+
+

g_mime_data_wrapper_set_stream ()

+
void                g_mime_data_wrapper_set_stream      (GMimeDataWrapper *wrapper,
+                                                         GMimeStream *stream);
+

+Replaces the wrapper's internal stream with stream. Don't forget, +if stream is not of the same encoding as the old stream, you'll +want to call g_mime_data_wrapper_set_encoding() as well. +

+

+Note: caller is responsible for its own reference on +stream. +

+
++ + + + + + + + + + +

wrapper :

a GMimeDataWrapper +

stream :

a GMimeStream +
+
+
+
+

g_mime_data_wrapper_get_stream ()

+
GMimeStream *       g_mime_data_wrapper_get_stream      (GMimeDataWrapper *wrapper);
+

+Gets a reference to the stream wrapped by wrapper. +

+
++ + + + + + + + + + +

wrapper :

a GMimeDataWrapper +

Returns :

a reference to the internal stream.
+
+
+
+

g_mime_data_wrapper_set_encoding ()

+
void                g_mime_data_wrapper_set_encoding    (GMimeDataWrapper *wrapper,
+                                                         GMimeContentEncoding encoding);
+

+Sets the encoding type of the internal stream. +

+
++ + + + + + + + + + +

wrapper :

a GMimeDataWrapper +

encoding :

encoding
+
+
+
+

g_mime_data_wrapper_get_encoding ()

+
GMimeContentEncoding g_mime_data_wrapper_get_encoding   (GMimeDataWrapper *wrapper);
+

+Gets the encoding type of the stream wrapped by wrapper. +

+
++ + + + + + + + + + +

wrapper :

a GMimeDataWrapper +

Returns :

the encoding type of the internal stream.
+
+
+
+

g_mime_data_wrapper_write_to_stream ()

+
ssize_t             g_mime_data_wrapper_write_to_stream (GMimeDataWrapper *wrapper,
+                                                         GMimeStream *stream);
+

+Writes the raw (decoded) data to the output stream. +

+
++ + + + + + + + + + + + + + +

wrapper :

a GMimeDataWrapper +

stream :

output stream

Returns :

the number of bytes written or -1 on failure.
+
+
+
+

See Also

+GMimePart +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilter.html b/docs/reference/html/GMimeFilter.html new file mode 100644 index 0000000..be4be39 --- /dev/null +++ b/docs/reference/html/GMimeFilter.html @@ -0,0 +1,303 @@ + + + + +GMimeFilter + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilter

+

GMimeFilter — Abstract filter class

+
+
+

Synopsis

+
struct              GMimeFilter;
+GMimeFilter *       g_mime_filter_copy                  (GMimeFilter *filter);
+void                g_mime_filter_filter                (GMimeFilter *filter,
+                                                         char *inbuf,
+                                                         size_t inlen,
+                                                         size_t prespace,
+                                                         char **outbuf,
+                                                         size_t *outlen,
+                                                         size_t *outprespace);
+void                g_mime_filter_complete              (GMimeFilter *filter,
+                                                         char *inbuf,
+                                                         size_t inlen,
+                                                         size_t prespace,
+                                                         char **outbuf,
+                                                         size_t *outlen,
+                                                         size_t *outprespace);
+void                g_mime_filter_reset                 (GMimeFilter *filter);
+void                g_mime_filter_backup                (GMimeFilter *filter,
+                                                         const char *data,
+                                                         size_t length);
+void                g_mime_filter_set_size              (GMimeFilter *filter,
+                                                         size_t size,
+                                                         gboolean keep);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterBasic
+         +----GMimeFilterBest
+         +----GMimeFilterCharset
+         +----GMimeFilterCRLF
+         +----GMimeFilterEnriched
+         +----GMimeFilterFrom
+         +----GMimeFilterGZip
+         +----GMimeFilterHTML
+         +----GMimeFilterMd5
+         +----GMimeFilterStrip
+         +----GMimeFilterWindows
+         +----GMimeFilterYenc
+
+
+
+

Description

+

+Stream filters are an efficient way of converting data from one +format to another. +

+
+
+

Details

+
+

struct GMimeFilter

+
struct GMimeFilter;
+

+Base class for filters used by GMimeStreamFilter. +

+
++ +
+
+
+
+

g_mime_filter_copy ()

+
GMimeFilter *       g_mime_filter_copy                  (GMimeFilter *filter);
+

+Copies filter into a new GMimeFilter object. +

+
++ + + + + + + + + + +

filter :

filter

Returns :

a duplicate of filter.
+
+
+
+

g_mime_filter_filter ()

+
void                g_mime_filter_filter                (GMimeFilter *filter,
+                                                         char *inbuf,
+                                                         size_t inlen,
+                                                         size_t prespace,
+                                                         char **outbuf,
+                                                         size_t *outlen,
+                                                         size_t *outprespace);
+

+Filters the input data and writes it to out. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

filter :

filter

inbuf :

input buffer

inlen :

input buffer length

prespace :

prespace buffer length

outbuf :

pointer to output buffer

outlen :

pointer to output length

outprespace :

pointer to output prespace buffer length
+
+
+
+

g_mime_filter_complete ()

+
void                g_mime_filter_complete              (GMimeFilter *filter,
+                                                         char *inbuf,
+                                                         size_t inlen,
+                                                         size_t prespace,
+                                                         char **outbuf,
+                                                         size_t *outlen,
+                                                         size_t *outprespace);
+

+Completes the filtering. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

filter :

filter

inbuf :

input buffer

inlen :

input buffer length

prespace :

prespace buffer length

outbuf :

pointer to output buffer

outlen :

pointer to output length

outprespace :

pointer to output prespace buffer length
+
+
+
+

g_mime_filter_reset ()

+
void                g_mime_filter_reset                 (GMimeFilter *filter);
+

+Resets the filter. +

+
++ + + + +

filter :

a GMimeFilter object
+
+
+
+

g_mime_filter_backup ()

+
void                g_mime_filter_backup                (GMimeFilter *filter,
+                                                         const char *data,
+                                                         size_t length);
+

+Sets number of bytes backed up on the input, new calls replace +previous ones +

+
++ + + + + + + + + + + + + + +

filter :

filter

data :

data to backup

length :

length of data +
+
+
+
+

g_mime_filter_set_size ()

+
void                g_mime_filter_set_size              (GMimeFilter *filter,
+                                                         size_t size,
+                                                         gboolean keep);
+

+Ensure this much size is available for filter output (if required) +

+
++ + + + + + + + + + + + + + +

filter :

filter

size :

requested size for the output buffer

keep :

+TRUE if existing data in the output buffer should be kept
+
+
+
+

See Also

+GMimeStreamFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterBasic.html b/docs/reference/html/GMimeFilterBasic.html new file mode 100644 index 0000000..d4b518c --- /dev/null +++ b/docs/reference/html/GMimeFilterBasic.html @@ -0,0 +1,113 @@ + + + + +GMimeFilterBasic + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterBasic

+

GMimeFilterBasic — Basic transfer encoding filter

+
+
+

Synopsis

+
struct              GMimeFilterBasic;
+GMimeFilter *       g_mime_filter_basic_new             (GMimeContentEncoding encoding,
+                                                         gboolean encode);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterBasic
+
+
+
+

Description

+

+A GMimeFilter which can encode or decode basic MIME encodings such +as Quoted-Printable, Base64 and UUEncode. +

+
+
+

Details

+
+

struct GMimeFilterBasic

+
struct GMimeFilterBasic;
+

+A basic encoder/decoder filter for the MIME encodings. +

+
++ +
+
+
+
+

g_mime_filter_basic_new ()

+
GMimeFilter *       g_mime_filter_basic_new             (GMimeContentEncoding encoding,
+                                                         gboolean encode);
+

+Creates a new basic filter for encoding. +

+
++ + + + + + + + + + + + + + +

encoding :

a GMimeContentEncoding +

encode :

+TRUE to encode or FALSE to decode

Returns :

a new basic encoder filter.
+
+
+
+

See Also

+GMimeFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterBest.html b/docs/reference/html/GMimeFilterBest.html new file mode 100644 index 0000000..8ee75e0 --- /dev/null +++ b/docs/reference/html/GMimeFilterBest.html @@ -0,0 +1,203 @@ + + + + +GMimeFilterBest + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterBest

+

GMimeFilterBest — Determine the best charset/encoding to use for a stream

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterBest
+
+
+
+

Description

+

+A GMimeFilter which is meant to determine the best charset and/or +transfer encoding suitable for the stream which is filtered through +it. +

+
+
+

Details

+
+

struct GMimeFilterBest

+
struct GMimeFilterBest;
+

+A filter for calculating the best encoding and/or charset to encode +the data passed through it. +

+
++ +
+
+
+
+

enum GMimeFilterBestFlags

+
typedef enum {
+	GMIME_FILTER_BEST_CHARSET  = (1 << 0),
+	GMIME_FILTER_BEST_ENCODING = (1 << 1)
+} GMimeFilterBestFlags;
+
+

+Bit flags to enable charset and/or encoding scanning to make +educated guesses as to what the best charset and/or encodings to +use for the content passed through the filter. +

+
++ + + + + + + + + + +

GMIME_FILTER_BEST_CHARSET

Enable best-charset detection. +

GMIME_FILTER_BEST_ENCODING

Enable best-encoding detection. +
+
+
+
+

g_mime_filter_best_new ()

+
GMimeFilter *       g_mime_filter_best_new              (GMimeFilterBestFlags flags);
+

+Creates a new GMimeFilterBest filter. flags are used to determine +which information to keep statistics of. If the +GMIME_FILTER_BEST_CHARSET bit is set, the filter will be able to +compute the best charset for encoding the stream of data +filtered. If the GMIME_FILTER_BEST_ENCODING bit is set, the filter +will be able to compute the best Content-Transfer-Encoding for use +with the stream being filtered. +

+

+Note: In order for the g_mime_filter_best_charset() function to +work, the stream being filtered MUST already be encoded in UTF-8. +

+
++ + + + + + + + + + +

flags :

filter flags

Returns :

a new best filter with flags flags.
+
+
+
+

g_mime_filter_best_charset ()

+
const char *        g_mime_filter_best_charset          (GMimeFilterBest *best);
+

+Calculates the best charset for encoding the stream filtered +through the best filter. +

+
++ + + + + + + + + + +

best :

best filter

Returns :

a pointer to a string containing the name of the charset +best suited for the text filtered through best.
+
+
+
+

g_mime_filter_best_encoding ()

+
GMimeContentEncoding g_mime_filter_best_encoding        (GMimeFilterBest *best,
+                                                         GMimeEncodingConstraint constraint);
+

+Calculates the most efficient Content-Transfer-Encoding for the +stream filtered through best that fits within the encoding +constraint. +

+
++ + + + + + + + + + + + + + +

best :

a GMimeFilterBest +

constraint :

a GMimeEncodingConstraint +

Returns :

the best encoding for the stream filtered by best.
+
+
+
+

See Also

+GMimeFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterCRLF.html b/docs/reference/html/GMimeFilterCRLF.html new file mode 100644 index 0000000..ad3c075 --- /dev/null +++ b/docs/reference/html/GMimeFilterCRLF.html @@ -0,0 +1,121 @@ + + + + +GMimeFilterCRLF + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterCRLF

+

GMimeFilterCRLF — Convert line-endings from LF to CRLF or vise versa

+
+
+

Synopsis

+
struct              GMimeFilterCRLF;
+GMimeFilter *       g_mime_filter_crlf_new              (gboolean encode,
+                                                         gboolean dots);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterCRLF
+
+
+
+

Description

+

+A GMimeFilter for converting between DOS and UNIX line-endings. +

+
+
+

Details

+
+

struct GMimeFilterCRLF

+
struct GMimeFilterCRLF;
+

+A filter to convert between line-ending formats and encode/decode +lines beginning with a '.'. +

+
++ +
+
+
+
+

g_mime_filter_crlf_new ()

+
GMimeFilter *       g_mime_filter_crlf_new              (gboolean encode,
+                                                         gboolean dots);
+

+Creates a new GMimeFilterCRLF filter. +

+

+If encode is TRUE, then lone line-feeds ('\n') will be 'encoded' +into the canonical CRLF end-of-line sequence ("\r\n") otherwise +CRLF sequences will be 'decoded' into the UNIX line-ending form +('\n'). +

+

+The dots parameter tells the filter whether or not it should +encode or decode lines beginning with a dot ('.'). If both encode +and dots are TRUE, then a '.' at the beginning of a line will be +'encoded' into "..". If encode is FALSE, then ".." at the +beginning of a line will be decoded into a single '.'. +

+
++ + + + + + + + + + + + + + +

encode :

+TRUE if the filter should encode or FALSE otherwise

dots :

encode/decode dots (as for SMTP)

Returns :

a new GMimeFilterCRLF filter.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterCharset.html b/docs/reference/html/GMimeFilterCharset.html new file mode 100644 index 0000000..ef0588d --- /dev/null +++ b/docs/reference/html/GMimeFilterCharset.html @@ -0,0 +1,108 @@ + + + + +GMimeFilterCharset + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterCharset

+

GMimeFilterCharset — Charset-conversion filter

+
+
+

Synopsis

+
struct              GMimeFilterCharset;
+GMimeFilter *       g_mime_filter_charset_new           (const char *from_charset,
+                                                         const char *to_charset);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterCharset
+
+
+
+

Description

+

+A GMimeFilter which is used for converting text from one charset +to another. +

+
+
+

Details

+
+

struct GMimeFilterCharset

+
struct GMimeFilterCharset;
+

+A filter to convert between charsets. +

+
++ +
+
+
+
+

g_mime_filter_charset_new ()

+
GMimeFilter *       g_mime_filter_charset_new           (const char *from_charset,
+                                                         const char *to_charset);
+

+Creates a new GMimeFilterCharset filter. +

+
++ + + + + + + + + + + + + + +

from_charset :

charset to convert from

to_charset :

charset to convert to

Returns :

a new charset filter or NULL if the charset conversion is +not possible.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterEnriched.html b/docs/reference/html/GMimeFilterEnriched.html new file mode 100644 index 0000000..1c69842 --- /dev/null +++ b/docs/reference/html/GMimeFilterEnriched.html @@ -0,0 +1,116 @@ + + + + +GMimeFilterEnriched + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterEnriched

+

GMimeFilterEnriched — Convert text/enriched or text/rtf to HTML

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterEnriched
+
+
+
+

Description

+

+A GMimeFilter used for converting text/enriched or text/rtf to HTML. +

+
+
+

Details

+
+

GMIME_FILTER_ENRICHED_IS_RICHTEXT

+
#define GMIME_FILTER_ENRICHED_IS_RICHTEXT  (1 << 0)
+
+

+A bit flag for g_mime_filter_enriched_new() which signifies that +the filter should expect Rich Text (aka RTF). +

+
+
+
+

struct GMimeFilterEnriched

+
struct GMimeFilterEnriched;
+

+A filter for converting text/enriched or text/richtext textual +streams into text/html. +

+
++ +
+
+
+
+

g_mime_filter_enriched_new ()

+
GMimeFilter *       g_mime_filter_enriched_new          (guint32 flags);
+

+Creates a new GMimeFilterEnriched object. +

+
++ + + + + + + + + + +

flags :

flags

Returns :

a new GMimeFilter object.
+
+
+
+

See Also

+GMimeFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterFrom.html b/docs/reference/html/GMimeFilterFrom.html new file mode 100644 index 0000000..7e4c664 --- /dev/null +++ b/docs/reference/html/GMimeFilterFrom.html @@ -0,0 +1,149 @@ + + + + +GMimeFilterFrom + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterFrom

+

GMimeFilterFrom — Escape MBox From_ lines

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterFrom
+
+
+
+

Description

+

+A GMimeFilter used for escaping MBox From_ lines using either the +traditional ">From " or quoted-printable encoding. +

+
+
+

Details

+
+

struct GMimeFilterFrom

+
struct GMimeFilterFrom;
+

+A filter for armoring or escaping lines beginning with "From ". +

+
++ +
+
+
+
+

enum GMimeFilterFromMode

+
typedef enum {
+	GMIME_FILTER_FROM_MODE_DEFAULT  = 0,
+	GMIME_FILTER_FROM_MODE_ESCAPE   = 0,
+	GMIME_FILTER_FROM_MODE_ARMOR    = 1
+} GMimeFilterFromMode;
+
+

+The mode for a GMimeFilterFrom filter. +

+
++ + + + + + + + + + + + + + +

GMIME_FILTER_FROM_MODE_DEFAULT

Default mode. +

GMIME_FILTER_FROM_MODE_ESCAPE

Escape 'From ' lines with a '>' +

GMIME_FILTER_FROM_MODE_ARMOR

QP-Encode 'From ' lines +
+
+
+
+

g_mime_filter_from_new ()

+
GMimeFilter *       g_mime_filter_from_new              (GMimeFilterFromMode mode);
+

+Creates a new GMimeFilterFrom filter. If mode is +GMIME_FILTER_FROM_MODE_ARMOR, the from-filter will encode from +lines using the quoted-printable encoding resulting in "=46rom ". +Using the GMIME_FILTER_FROM_MODE_DEFAULT or +GMIME_FILTER_FROM_MODE_ESCAPE mode (they are the same), from lines +will be escaped to ">From ". +

+

+Note: If you plan on using a from-filter in mode ARMOR, you should +remember to also use a GMimeFilterBasic filter with an encoding of +GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE. +

+
++ + + + + + + + + + +

mode :

filter mode

Returns :

a new from filter with mode mode.
+
+
+
+

See Also

+GMimeFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterGZip.html b/docs/reference/html/GMimeFilterGZip.html new file mode 100644 index 0000000..8bbc1b7 --- /dev/null +++ b/docs/reference/html/GMimeFilterGZip.html @@ -0,0 +1,139 @@ + + + + +GMimeFilterGZip + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterGZip

+

GMimeFilterGZip — GNU Zip compression/decompression

+
+
+

Synopsis

+
struct              GMimeFilterGZip;
+enum                GMimeFilterGZipMode;
+GMimeFilter *       g_mime_filter_gzip_new              (GMimeFilterGZipMode mode,
+                                                         int level);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterGZip
+
+
+
+

Description

+

+A GMimeFilter used for compressing or decompressing a stream using +GNU Zip. +

+
+
+

Details

+
+

struct GMimeFilterGZip

+
struct GMimeFilterGZip;
+

+A filter for compresing or decompressing a gzip stream. +

+
++ +
+
+
+
+

enum GMimeFilterGZipMode

+
typedef enum {
+	GMIME_FILTER_GZIP_MODE_ZIP,
+	GMIME_FILTER_GZIP_MODE_UNZIP
+} GMimeFilterGZipMode;
+
+

+The mode for the GMimeFilterGZip filter. +

+
++ + + + + + + + + + +

GMIME_FILTER_GZIP_MODE_ZIP

Compress (zip) mode. +

GMIME_FILTER_GZIP_MODE_UNZIP

Uncompress (unzip) mode. +
+
+
+
+

g_mime_filter_gzip_new ()

+
GMimeFilter *       g_mime_filter_gzip_new              (GMimeFilterGZipMode mode,
+                                                         int level);
+

+Creates a new gzip (or gunzip) filter. +

+
++ + + + + + + + + + + + + + +

mode :

zip or unzip

level :

compression level

Returns :

a new gzip (or gunzip) filter.
+
+
+
+

See Also

+GMimeFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterHTML.html b/docs/reference/html/GMimeFilterHTML.html new file mode 100644 index 0000000..0b3a46d --- /dev/null +++ b/docs/reference/html/GMimeFilterHTML.html @@ -0,0 +1,192 @@ + + + + +GMimeFilterHTML + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterHTML

+

GMimeFilterHTML — Convert plain text into HTML

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterHTML
+
+
+
+

Description

+

+A GMimeFilter used for converting plain text into HTML. +

+
+
+

Details

+
+

struct GMimeFilterHTML

+
struct GMimeFilterHTML;
+

+A filter for converting text/plain into text/html. +

+
++ +
+
+
+
+

GMIME_FILTER_HTML_PRE

+
#define GMIME_FILTER_HTML_PRE               (1 << 0)
+
+

+Wrap stream in <pre> tags. +

+
+
+
+

GMIME_FILTER_HTML_CONVERT_NL

+
#define GMIME_FILTER_HTML_CONVERT_NL        (1 << 1)
+
+

+Convert new-lines ('\n') into <br> tags. +

+
+
+
+

GMIME_FILTER_HTML_CONVERT_SPACES

+
#define GMIME_FILTER_HTML_CONVERT_SPACES    (1 << 2)
+
+

+Preserve whitespace by converting spaces into their appropriate +html entities. +

+
+
+
+

GMIME_FILTER_HTML_CONVERT_URLS

+
#define GMIME_FILTER_HTML_CONVERT_URLS      (1 << 3)
+
+

+Wrap detected URLs in <a href=...> tags. +

+
+
+
+

GMIME_FILTER_HTML_MARK_CITATION

+
#define GMIME_FILTER_HTML_MARK_CITATION     (1 << 4)
+
+

+Change the colour of citation text. +

+
+
+
+

GMIME_FILTER_HTML_CONVERT_ADDRESSES

+
#define GMIME_FILTER_HTML_CONVERT_ADDRESSES (1 << 5)
+
+

+Wrap email addresses in "mailto:" href tags. +

+
+
+
+

GMIME_FILTER_HTML_ESCAPE_8BIT

+
#define GMIME_FILTER_HTML_ESCAPE_8BIT       (1 << 6)
+
+

+Converts 8bit characters to '?'. +

+
+
+
+

GMIME_FILTER_HTML_CITE

+
#define GMIME_FILTER_HTML_CITE              (1 << 7)
+
+

+Cites text by prepending "> " to each cited line. +

+
+
+
+

g_mime_filter_html_new ()

+
GMimeFilter *       g_mime_filter_html_new              (guint32 flags,
+                                                         guint32 colour);
+

+Creates a new GMimeFilterHTML filter which can be used to convert a +plain UTF-8 text stream into an html stream. +

+
++ + + + + + + + + + + + + + +

flags :

html flags

colour :

citation colour

Returns :

a new html filter.
+
+
+
+

See Also

+GMimeFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterMd5.html b/docs/reference/html/GMimeFilterMd5.html new file mode 100644 index 0000000..8166ef0 --- /dev/null +++ b/docs/reference/html/GMimeFilterMd5.html @@ -0,0 +1,122 @@ + + + + +GMimeFilterMd5 + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterMd5

+

GMimeFilterMd5 — Calculate an md5sum

+
+
+

Synopsis

+
struct              GMimeFilterMd5;
+GMimeFilter *       g_mime_filter_md5_new               (void);
+void                g_mime_filter_md5_get_digest        (GMimeFilterMd5 *md5,
+                                                         unsigned char digest[16]);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterMd5
+
+
+
+

Description

+

+Calculate an md5sum for a stream. +

+
+
+

Details

+
+

struct GMimeFilterMd5

+
struct GMimeFilterMd5;
+

+A filter for calculating the MD5 checksum of a stream. +

+
++ +
+
+
+
+

g_mime_filter_md5_new ()

+
GMimeFilter *       g_mime_filter_md5_new               (void);
+

+Creates a new Md5 filter. +

+
++ + + + +

Returns :

a new Md5 filter.
+
+
+
+

g_mime_filter_md5_get_digest ()

+
void                g_mime_filter_md5_get_digest        (GMimeFilterMd5 *md5,
+                                                         unsigned char digest[16]);
+

+Outputs the md5 digest into digest. +

+
++ + + + + + + + + + +

md5 :

md5 filter object

digest :

output buffer of at least 16 bytes
+
+
+
+

See Also

+GMimeFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterStrip.html b/docs/reference/html/GMimeFilterStrip.html new file mode 100644 index 0000000..522cec1 --- /dev/null +++ b/docs/reference/html/GMimeFilterStrip.html @@ -0,0 +1,100 @@ + + + + +GMimeFilterStrip + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterStrip

+

GMimeFilterStrip — Strip trailing whitespace from the end of lines

+
+
+

Synopsis

+
struct              GMimeFilterStrip;
+GMimeFilter *       g_mime_filter_strip_new             (void);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterStrip
+
+
+
+

Description

+

+A GMimeFilter used for stripping trailing whitespace from the end +of lines. +

+
+
+

Details

+
+

struct GMimeFilterStrip

+
struct GMimeFilterStrip;
+

+A filter for stripping whitespace from the end of lines. +

+
++ +
+
+
+
+

g_mime_filter_strip_new ()

+
GMimeFilter *       g_mime_filter_strip_new             (void);
+

+Creates a new GMimeFilterStrip filter which will strip trailing +whitespace from every line of input passed through the filter. +

+
++ + + + +

Returns :

a new strip filter.
+
+
+
+

See Also

+GMimeFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterWindows.html b/docs/reference/html/GMimeFilterWindows.html new file mode 100644 index 0000000..435cfd3 --- /dev/null +++ b/docs/reference/html/GMimeFilterWindows.html @@ -0,0 +1,160 @@ + + + + +GMimeFilterWindows + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterWindows

+

GMimeFilterWindows — Determine if text is in a Microsoft Windows codepage

+
+
+

Synopsis

+
struct              GMimeFilterWindows;
+GMimeFilter *       g_mime_filter_windows_new           (const char *claimed_charset);
+gboolean            g_mime_filter_windows_is_windows_charset
+                                                        (GMimeFilterWindows *filter);
+const char *        g_mime_filter_windows_real_charset  (GMimeFilterWindows *filter);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterWindows
+
+
+
+

Description

+

+A GMimeFilter used for determining if text marked as iso-8859-## +is actually encoded in one of the Windows-CP125# charsets. +

+
+
+

Details

+
+

struct GMimeFilterWindows

+
struct GMimeFilterWindows;
+

+A filter for detecting whether or not a text stream claimed to be +iso-8859-X is really that charset or if it is really a +Windows-CP125x charset. +

+
++ +
+
+
+
+

g_mime_filter_windows_new ()

+
GMimeFilter *       g_mime_filter_windows_new           (const char *claimed_charset);
+

+Creates a new GMimeFilterWindows filter. When a stream of text has +been filtered, it can be determined whether or not said text stream +was in claimed_charset or the equivalent Windows-CP125# charset. +

+
++ + + + + + + + + + +

claimed_charset :

charset that a text stream claims to be

Returns :

a new windows filter.
+
+
+
+

g_mime_filter_windows_is_windows_charset ()

+
gboolean            g_mime_filter_windows_is_windows_charset
+                                                        (GMimeFilterWindows *filter);
+

+Determines whether or not a Windows-CP125# charset has been +detected so far. +

+
++ + + + + + + + + + +

filter :

windows filter object

Returns :

+TRUE if the filtered stream has been detected to contain +Windows-CP125# characters or FALSE otherwise.
+
+
+
+

g_mime_filter_windows_real_charset ()

+
const char *        g_mime_filter_windows_real_charset  (GMimeFilterWindows *filter);
+

+Figures out the real charset that the text is encoded in based on whether or not Windows-CP125# characters were found. +

+
++ + + + + + + + + + +

filter :

windows filter object

Returns :

a const string pointer to the claimed charset if filtered +text stream was found not to contain any Windows-CP125# characters +or the proper Windows-CP125# charset.
+
+
+
+

See Also

+GMimeFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeFilterYenc.html b/docs/reference/html/GMimeFilterYenc.html new file mode 100644 index 0000000..ce4c6ca --- /dev/null +++ b/docs/reference/html/GMimeFilterYenc.html @@ -0,0 +1,498 @@ + + + + +GMimeFilterYenc + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeFilterYenc

+

GMimeFilterYenc — yEncode or yDecode

+
+
+

Synopsis

+
struct              GMimeFilterYenc;
+GMimeFilter *       g_mime_filter_yenc_new              (gboolean encode);
+void                g_mime_filter_yenc_set_state        (GMimeFilterYenc *yenc,
+                                                         int state);
+void                g_mime_filter_yenc_set_crc          (GMimeFilterYenc *yenc,
+                                                         guint32 crc);
+guint32             g_mime_filter_yenc_get_crc          (GMimeFilterYenc *yenc);
+guint32             g_mime_filter_yenc_get_pcrc         (GMimeFilterYenc *yenc);
+
+#define             GMIME_YENCODE_CRC_INIT
+#define             GMIME_YENCODE_CRC_FINAL             (crc)
+#define             GMIME_YENCODE_STATE_INIT
+#define             GMIME_YDECODE_STATE_INIT
+#define             GMIME_YDECODE_STATE_EOLN
+#define             GMIME_YDECODE_STATE_ESCAPE
+#define             GMIME_YDECODE_STATE_END
+#define             GMIME_YDECODE_STATE_BEGIN
+#define             GMIME_YDECODE_STATE_DECODE
+#define             GMIME_YDECODE_STATE_PART
+size_t              g_mime_ydecode_step                 (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *pcrc,
+                                                         guint32 *crc);
+size_t              g_mime_yencode_step                 (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *pcrc,
+                                                         guint32 *crc);
+size_t              g_mime_yencode_close                (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *pcrc,
+                                                         guint32 *crc);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeFilter
+         +----GMimeFilterYenc
+
+
+
+

Description

+

+A GMimeFilter used to encode or decode the Usenet yEncoding. +

+
+
+

Details

+
+

struct GMimeFilterYenc

+
struct GMimeFilterYenc;
+

+A filter for yEncoding or yDecoding a stream. +

+
++ +
+
+
+
+

g_mime_filter_yenc_new ()

+
GMimeFilter *       g_mime_filter_yenc_new              (gboolean encode);
+

+Creates a new yEnc filter. +

+
++ + + + + + + + + + +

encode :

encode vs decode

Returns :

a new yEnc filter.
+
+
+
+

g_mime_filter_yenc_set_state ()

+
void                g_mime_filter_yenc_set_state        (GMimeFilterYenc *yenc,
+                                                         int state);
+

+Sets the current state of the yencoder/ydecoder +

+
++ + + + + + + + + + +

yenc :

yEnc filter

state :

encode/decode state
+
+
+
+

g_mime_filter_yenc_set_crc ()

+
void                g_mime_filter_yenc_set_crc          (GMimeFilterYenc *yenc,
+                                                         guint32 crc);
+

+Sets the current crc32 value on the yEnc filter yenc to crc. +

+
++ + + + + + + + + + +

yenc :

yEnc filter

crc :

crc32
+
+
+
+

g_mime_filter_yenc_get_crc ()

+
guint32             g_mime_filter_yenc_get_crc          (GMimeFilterYenc *yenc);
+

+Get the computed crc or (guint32) -1 on fail. +

+
++ + + + + + + + + + +

yenc :

yEnc filter

Returns :

the computed crc or (guint32) -1 on fail.
+
+
+
+

g_mime_filter_yenc_get_pcrc ()

+
guint32             g_mime_filter_yenc_get_pcrc         (GMimeFilterYenc *yenc);
+

+Get the computed part crc or (guint32) -1 on fail. +

+
++ + + + + + + + + + +

yenc :

yEnc filter

Returns :

the computed part crc or (guint32) -1 on fail.
+
+
+
+

GMIME_YENCODE_CRC_INIT

+
#define GMIME_YENCODE_CRC_INIT       (~0)
+
+

+Initial state for the crc and pcrc state variables. +

+
+
+
+

GMIME_YENCODE_CRC_FINAL()

+
#define GMIME_YENCODE_CRC_FINAL(crc) (~crc)
+
+

+Gets the final crc value from crc. +

+
++ + + + +

crc :

crc or pcrc state variable
+
+
+
+

GMIME_YENCODE_STATE_INIT

+
#define GMIME_YENCODE_STATE_INIT     (0)
+
+

+Initial state for the g_mime_ydecode_step() function. +

+
+
+
+

GMIME_YDECODE_STATE_INIT

+
#define GMIME_YDECODE_STATE_INIT     (0)
+
+

+Initial state for the g_mime_ydecode_step() function. +

+
+
+
+

GMIME_YDECODE_STATE_EOLN

+
#define GMIME_YDECODE_STATE_EOLN     (1 << 8)
+
+

+State bit that denotes the yEnc filter has reached an end-of-line. +

+

+This state is for internal use only. +

+
+
+
+

GMIME_YDECODE_STATE_ESCAPE

+
#define GMIME_YDECODE_STATE_ESCAPE   (1 << 9)
+
+

+State bit that denotes the yEnc filter has reached an escape +sequence. +

+

+This state is for internal use only. +

+
+
+
+

GMIME_YDECODE_STATE_END

+
#define GMIME_YDECODE_STATE_END      (1 << 15)
+
+

+State bit that denoates that g_mime_ydecode_step() has finished +decoding. +

+
+
+
+

GMIME_YDECODE_STATE_BEGIN

+
#define GMIME_YDECODE_STATE_BEGIN    (1 << 12)
+
+

+State bit that denotes the yEnc filter has found the =ybegin line. +

+
+
+
+

GMIME_YDECODE_STATE_DECODE

+
#define GMIME_YDECODE_STATE_DECODE   (1 << 14)
+
+

+State bit that denotes yEnc filter has begun decoding the actual +yencoded content and will continue to do so until an =yend line is +found (or until there is nothing left to decode). +

+
+
+
+

GMIME_YDECODE_STATE_PART

+
#define GMIME_YDECODE_STATE_PART     (1 << 13)
+
+

+State bit that denotes the yEnc filter has found the =ypart +line. (Note: not all yencoded blocks have one) +

+
+
+
+

g_mime_ydecode_step ()

+
size_t              g_mime_ydecode_step                 (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *pcrc,
+                                                         guint32 *crc);
+

+Performs a 'decode step' on a chunk of yEncoded data of length +inlen pointed to by inbuf and writes to outbuf. Assumes the =ybegin +and =ypart lines have already been stripped off. +

+

+To get the crc32 value of the part, use GMIME_YENCODE_CRC_FINAL +(pcrc). If there are more parts, you should reuse crc without +re-initializing. Once all parts have been decoded, you may get the +combined crc32 value of all the parts using GMIME_YENCODE_CRC_FINAL +(crc). +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

state :

ydecode state

pcrc :

part crc state

crc :

crc state

Returns :

the number of bytes decoded.
+
+
+
+

g_mime_yencode_step ()

+
size_t              g_mime_yencode_step                 (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *pcrc,
+                                                         guint32 *crc);
+

+Performs an yEncode 'encode step' on a chunk of raw data of length +inlen pointed to by inbuf and writes to outbuf. +

+

+state should be initialized to GMIME_YENCODE_STATE_INIT before +beginning making the first call to this function. Subsequent calls +should reuse state. +

+

+Along the same lines, pcrc and crc should be initialized to +GMIME_YENCODE_CRC_INIT before using. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

state :

yencode state

pcrc :

part crc state

crc :

crc state

Returns :

the number of bytes encoded.
+
+
+
+

g_mime_yencode_close ()

+
size_t              g_mime_yencode_close                (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *pcrc,
+                                                         guint32 *crc);
+

+Call this function when finished encoding data with +g_mime_yencode_step() to flush off the remaining state. +

+

+GMIME_YENCODE_CRC_FINAL (pcrc) will give you the crc32 of the +encoded "part". If there are more "parts" to encode, you should +re-use crc when encoding the next "parts" and then use +GMIME_YENCODE_CRC_FINAL (crc) to get the combined crc32 value of +all the parts. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

state :

yencode state

pcrc :

part crc state

crc :

crc state

Returns :

the number of bytes encoded.
+
+
+
+

See Also

+GMimeFilter +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeGpgContext.html b/docs/reference/html/GMimeGpgContext.html new file mode 100644 index 0000000..2df5eca --- /dev/null +++ b/docs/reference/html/GMimeGpgContext.html @@ -0,0 +1,264 @@ + + + + +GMimeGpgContext + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeGpgContext

+

GMimeGpgContext — GnuPG crypto contexts

+
+
+

Synopsis

+
struct              GMimeGpgContext;
+GMimeCryptoContext * g_mime_gpg_context_new             (GMimePasswordRequestFunc request_passwd,
+                                                         const char *path);
+gboolean            g_mime_gpg_context_get_always_trust (GMimeGpgContext *ctx);
+void                g_mime_gpg_context_set_always_trust (GMimeGpgContext *ctx,
+                                                         gboolean always_trust);
+gboolean            g_mime_gpg_context_get_auto_key_retrieve
+                                                        (GMimeGpgContext *ctx);
+void                g_mime_gpg_context_set_auto_key_retrieve
+                                                        (GMimeGpgContext *ctx,
+                                                         gboolean auto_key_retrieve);
+gboolean            g_mime_gpg_context_get_use_agent    (GMimeGpgContext *ctx);
+void                g_mime_gpg_context_set_use_agent    (GMimeGpgContext *ctx,
+                                                         gboolean use_agent);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeCryptoContext
+         +----GMimeGpgContext
+
+
+
+

Description

+

+A GMimeGpgContext is a GMimeCryptoContext that uses GnuPG to do +all of the encryption and digital signatures. +

+
+
+

Details

+
+

struct GMimeGpgContext

+
struct GMimeGpgContext;
+

+A GnuPG crypto context. +

+
++ +
+
+
+
+

g_mime_gpg_context_new ()

+
GMimeCryptoContext * g_mime_gpg_context_new             (GMimePasswordRequestFunc request_passwd,
+                                                         const char *path);
+

+Creates a new gpg crypto context object. +

+
++ + + + + + + + + + + + + + +

request_passwd :

a GMimePasswordRequestFunc +

path :

path to gpg binary

Returns :

a new gpg crypto context object.
+
+
+
+

g_mime_gpg_context_get_always_trust ()

+
gboolean            g_mime_gpg_context_get_always_trust (GMimeGpgContext *ctx);
+

+Gets the always_trust flag on the gpg context. +

+
++ + + + + + + + + + +

ctx :

a GMimeGpgContext +

Returns :

the always_trust flag on the gpg context.
+
+
+
+

g_mime_gpg_context_set_always_trust ()

+
void                g_mime_gpg_context_set_always_trust (GMimeGpgContext *ctx,
+                                                         gboolean always_trust);
+

+Sets the always_trust flag on the gpg context which is used for +encryption. +

+
++ + + + + + + + + + +

ctx :

a GMimeGpgContext +

always_trust :

always trust flag
+
+
+
+

g_mime_gpg_context_get_auto_key_retrieve ()

+
gboolean            g_mime_gpg_context_get_auto_key_retrieve
+                                                        (GMimeGpgContext *ctx);
+

+Gets the auto_key_retrieve flag on the gpg context. +

+
++ + + + + + + + + + +

ctx :

a GMimeGpgContext +

Returns :

the auto_key_retrieve flag on the gpg context.
+
+
+
+

g_mime_gpg_context_set_auto_key_retrieve ()

+
void                g_mime_gpg_context_set_auto_key_retrieve
+                                                        (GMimeGpgContext *ctx,
+                                                         gboolean auto_key_retrieve);
+

+Sets the auto_key_retrieve flag on the gpg context which is used +for signature verification. +

+
++ + + + + + + + + + +

ctx :

a GMimeGpgContext +

auto_key_retrieve :

auto-retrieve keys from a keys server
+
+
+
+

g_mime_gpg_context_get_use_agent ()

+
gboolean            g_mime_gpg_context_get_use_agent    (GMimeGpgContext *ctx);
+

+Gets the use_agent flag on the gpg context. +

+
++ + + + + + + + + + +

ctx :

a GMimeGpgContext +

Returns :

the use_agent flag on the gpg context, which indicates +that GnuPG should attempt to use gpg-agent for credentials.
+
+
+
+

g_mime_gpg_context_set_use_agent ()

+
void                g_mime_gpg_context_set_use_agent    (GMimeGpgContext *ctx,
+                                                         gboolean use_agent);
+

+Sets the use_agent flag on the gpg context, which indicates that +GnuPG should attempt to use gpg-agent for credentials. +

+
++ + + + + + + + + + +

ctx :

a GMimeGpgContext +

use_agent :

always trust flag
+
+
+
+

See Also

+GMimeCryptoContext +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeMessage.html b/docs/reference/html/GMimeMessage.html new file mode 100644 index 0000000..225e4e4 --- /dev/null +++ b/docs/reference/html/GMimeMessage.html @@ -0,0 +1,624 @@ + + + + +GMimeMessage + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMessage

+

GMimeMessage — Messages

+
+
+

Synopsis

+
enum                GMimeRecipientType;
+struct              GMimeMessage;
+GMimeMessage *      g_mime_message_new                  (gboolean pretty_headers);
+void                g_mime_message_set_sender           (GMimeMessage *message,
+                                                         const char *sender);
+const char *        g_mime_message_get_sender           (GMimeMessage *message);
+void                g_mime_message_set_reply_to         (GMimeMessage *message,
+                                                         const char *reply_to);
+const char *        g_mime_message_get_reply_to         (GMimeMessage *message);
+void                g_mime_message_add_recipient        (GMimeMessage *message,
+                                                         GMimeRecipientType type,
+                                                         const char *name,
+                                                         const char *addr);
+InternetAddressList * g_mime_message_get_recipients     (GMimeMessage *message,
+                                                         GMimeRecipientType type);
+InternetAddressList * g_mime_message_get_all_recipients (GMimeMessage *message);
+void                g_mime_message_set_subject          (GMimeMessage *message,
+                                                         const char *subject);
+const char *        g_mime_message_get_subject          (GMimeMessage *message);
+void                g_mime_message_set_date             (GMimeMessage *message,
+                                                         time_t date,
+                                                         int tz_offset);
+void                g_mime_message_get_date             (GMimeMessage *message,
+                                                         time_t *date,
+                                                         int *tz_offset);
+void                g_mime_message_set_date_as_string   (GMimeMessage *message,
+                                                         const char *str);
+char *              g_mime_message_get_date_as_string   (GMimeMessage *message);
+void                g_mime_message_set_message_id       (GMimeMessage *message,
+                                                         const char *message_id);
+const char *        g_mime_message_get_message_id       (GMimeMessage *message);
+void                g_mime_message_set_mime_part        (GMimeMessage *message,
+                                                         GMimeObject *mime_part);
+GMimeObject *       g_mime_message_get_mime_part        (GMimeMessage *message);
+void                g_mime_message_foreach              (GMimeMessage *message,
+                                                         GMimeObjectForeachFunc callback,
+                                                         gpointer user_data);
+GMimeObject *       g_mime_message_get_body             (GMimeMessage *message);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeObject
+         +----GMimeMessage
+
+
+
+

Description

+

+A GMimeMessage represents an rfc822 message. +

+
+
+

Details

+
+

enum GMimeRecipientType

+
typedef enum {
+	GMIME_RECIPIENT_TYPE_TO,
+	GMIME_RECIPIENT_TYPE_CC,
+	GMIME_RECIPIENT_TYPE_BCC
+} GMimeRecipientType;
+
+

+A message recipient type. +

+
++ + + + + + + + + + + + + + +

GMIME_RECIPIENT_TYPE_TO

Represents the recipients in the To: header. +

GMIME_RECIPIENT_TYPE_CC

Represents the recipients in the Cc: header. +

GMIME_RECIPIENT_TYPE_BCC

Represents the recipients in the Bcc: header. +
+
+
+
+

struct GMimeMessage

+
struct GMimeMessage;
+

+A MIME Message object. +

+
++ +
+
+
+
+

g_mime_message_new ()

+
GMimeMessage *      g_mime_message_new                  (gboolean pretty_headers);
+

+If pretty_headers is TRUE, then the standard rfc822 headers are +initialized so as to put headers in a nice friendly order. This is +strictly a cosmetic thing, so if you are unsure, it is safe to say +no (FALSE). +

+
++ + + + + + + + + + +

pretty_headers :

make pretty headers

Returns :

an empty GMimeMessage object.
+
+
+
+

g_mime_message_set_sender ()

+
void                g_mime_message_set_sender           (GMimeMessage *message,
+                                                         const char *sender);
+

+Set the sender's name and address on the MIME Message. +(ex: "\"Joe Sixpack\" <joesixpack.org>") +

+
++ + + + + + + + + + +

message :

MIME Message to change

sender :

The name and address of the sender
+
+
+
+

g_mime_message_get_sender ()

+
const char *        g_mime_message_get_sender           (GMimeMessage *message);
+

+Gets the email address of the sender from message. +

+
++ + + + + + + + + + +

message :

MIME Message

Returns :

the sender's name and address of the MIME Message.
+
+
+
+

g_mime_message_set_reply_to ()

+
void                g_mime_message_set_reply_to         (GMimeMessage *message,
+                                                         const char *reply_to);
+

+Set the sender's Reply-To address on the MIME Message. +

+
++ + + + + + + + + + +

message :

MIME Message to change

reply_to :

The Reply-To address
+
+
+
+

g_mime_message_get_reply_to ()

+
const char *        g_mime_message_get_reply_to         (GMimeMessage *message);
+

+Gets the Reply-To address from message. +

+
++ + + + + + + + + + +

message :

MIME Message

Returns :

the sender's Reply-To address from the MIME Message.
+
+
+
+

g_mime_message_add_recipient ()

+
void                g_mime_message_add_recipient        (GMimeMessage *message,
+                                                         GMimeRecipientType type,
+                                                         const char *name,
+                                                         const char *addr);
+

+Add a recipient of a chosen type to the MIME Message. +

+
++ + + + + + + + + + + + + + + + + + +

message :

MIME Message to change

type :

A GMimeRecipientType +

name :

The recipient's name (or NULL)

addr :

The recipient's address
+
+
+
+

g_mime_message_get_recipients ()

+
InternetAddressList * g_mime_message_get_recipients     (GMimeMessage *message,
+                                                         GMimeRecipientType type);
+

+Gets a list of recipients of type type from message. +

+
++ + + + + + + + + + + + + + +

message :

MIME Message

type :

A GMimeRecipientType +

Returns :

a list of recipients of a chosen type from the MIME +Message.
+
+
+
+

g_mime_message_get_all_recipients ()

+
InternetAddressList * g_mime_message_get_all_recipients (GMimeMessage *message);
+

+Gets the complete list of recipients for message. +

+
++ + + + + + + + + + +

message :

MIME Message

Returns :

a newly allocated InternetAddressList containing all +recipients of the message or NULL if no recipients are set.
+
+
+
+

g_mime_message_set_subject ()

+
void                g_mime_message_set_subject          (GMimeMessage *message,
+                                                         const char *subject);
+

+Set the unencoded UTF-8 Subject field on a MIME Message. +

+
++ + + + + + + + + + +

message :

MIME Message

subject :

Subject string
+
+
+
+

g_mime_message_get_subject ()

+
const char *        g_mime_message_get_subject          (GMimeMessage *message);
+

+Gets the message's subject. +

+
++ + + + + + + + + + +

message :

MIME Message

Returns :

the unencoded UTF-8 Subject field on a MIME Message.
+
+
+
+

g_mime_message_set_date ()

+
void                g_mime_message_set_date             (GMimeMessage *message,
+                                                         time_t date,
+                                                         int tz_offset);
+

+Sets the Date header on a MIME Message. +

+
++ + + + + + + + + + + + + + +

message :

MIME Message

date :

a date to be used in the Date header

tz_offset :

timezone offset (in +/- hours)
+
+
+
+

g_mime_message_get_date ()

+
void                g_mime_message_get_date             (GMimeMessage *message,
+                                                         time_t *date,
+                                                         int *tz_offset);
+

+Stores the date in time_t format in date. If tz_offset is +non-NULL, then the timezone offset in will be stored in +tz_offset. +

+
++ + + + + + + + + + + + + + +

message :

MIME Message

date :

pointer to a date in time_t

tz_offset :

pointer to timezone offset (in +/- hours)
+
+
+
+

g_mime_message_set_date_as_string ()

+
void                g_mime_message_set_date_as_string   (GMimeMessage *message,
+                                                         const char *str);
+

+Sets the sent-date of the message. +

+
++ + + + + + + + + + +

message :

MIME Message

str :

a date string
+
+
+
+

g_mime_message_get_date_as_string ()

+
char *              g_mime_message_get_date_as_string   (GMimeMessage *message);
+

+Gets the message's sent-date in string format. +

+
++ + + + + + + + + + +

message :

MIME Message

Returns :

a newly allocated string containing the Date header value.
+
+
+
+

g_mime_message_set_message_id ()

+
void                g_mime_message_set_message_id       (GMimeMessage *message,
+                                                         const char *message_id);
+

+Set the Message-Id on a message. +

+
++ + + + + + + + + + +

message :

MIME Message

message_id :

message-id (addr-spec portion)
+
+
+
+

g_mime_message_get_message_id ()

+
const char *        g_mime_message_get_message_id       (GMimeMessage *message);
+

+Gets the Message-Id header of message. +

+
++ + + + + + + + + + +

message :

MIME Message

Returns :

the Message-Id of a message.
+
+
+
+

g_mime_message_set_mime_part ()

+
void                g_mime_message_set_mime_part        (GMimeMessage *message,
+                                                         GMimeObject *mime_part);
+

+Set the root-level MIME part of the message. +

+
++ + + + + + + + + + +

message :

MIME Message

mime_part :

The root-level MIME Part
+
+
+
+

g_mime_message_get_mime_part ()

+
GMimeObject *       g_mime_message_get_mime_part        (GMimeMessage *message);
+

+Gets the toplevel MIME part contained within message. +

+
++ + + + + + + + + + +

message :

MIME Message

Returns :

the toplevel MIME part of message.
+
+
+
+

g_mime_message_foreach ()

+
void                g_mime_message_foreach              (GMimeMessage *message,
+                                                         GMimeObjectForeachFunc callback,
+                                                         gpointer user_data);
+

+Recursively calls callback on each of the mime parts in the mime message. +

+
++ + + + + + + + + + + + + + +

message :

a GMimeMessage +

callback :

function to call on each of the mime parts contained by the mime message

user_data :

user-supplied callback data
+
+
+
+

g_mime_message_get_body ()

+
GMimeObject *       g_mime_message_get_body             (GMimeMessage *message);
+

+Attempts to identify the MIME part containing the body of the +message. +

+
++ + + + + + + + + + +

message :

MIME Message

Returns :

a GMimeObject containing the textual content that appears +to be the main body of the message. +Note: This function is NOT guarenteed to always work as it +makes some assumptions that are not necessarily true. It is +recommended that you traverse the MIME structure yourself.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeMessagePart.html b/docs/reference/html/GMimeMessagePart.html new file mode 100644 index 0000000..e4e41d5 --- /dev/null +++ b/docs/reference/html/GMimeMessagePart.html @@ -0,0 +1,181 @@ + + + + +GMimeMessagePart + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMessagePart

+

GMimeMessagePart — Message parts

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeObject
+         +----GMimeMessagePart
+
+
+
+

Description

+

+A GMimeMessagePart represents message/rfc822 and message/news MIME +parts. +

+
+
+

Details

+
+

struct GMimeMessagePart

+
struct GMimeMessagePart;
+

+A message/rfc822 or message/news MIME part. +

+
++ +
+
+
+
+

g_mime_message_part_new ()

+
GMimeMessagePart *  g_mime_message_part_new             (const char *subtype);
+

+Creates a new MIME message part object with a default content-type +of message/subtype. +

+
++ + + + + + + + + + +

subtype :

message subtype or NULL for "rfc822"

Returns :

an empty MIME message part object with a default +content-type of message/subtype.
+
+
+
+

g_mime_message_part_new_with_message ()

+
GMimeMessagePart *  g_mime_message_part_new_with_message
+                                                        (const char *subtype,
+                                                         GMimeMessage *message);
+

+Creates a new MIME message part object with a default content-type +of message/subtype containing message. +

+
++ + + + + + + + + + + + + + +

subtype :

message subtype or NULL for "rfc822"

message :

message

Returns :

a MIME message part object with a default content-type of +message/subtype containing message.
+
+
+
+

g_mime_message_part_get_message ()

+
GMimeMessage *      g_mime_message_part_get_message     (GMimeMessagePart *part);
+

+Gets the message object on the message part object part. +

+
++ + + + + + + + + + +

part :

message part

Returns :

the message part contained within part.
+
+
+
+

g_mime_message_part_set_message ()

+
void                g_mime_message_part_set_message     (GMimeMessagePart *part,
+                                                         GMimeMessage *message);
+

+Sets the message object on the message part object part. +

+
++ + + + + + + + + + +

part :

message part

message :

message
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeMessagePartial.html b/docs/reference/html/GMimeMessagePartial.html new file mode 100644 index 0000000..6bd6790 --- /dev/null +++ b/docs/reference/html/GMimeMessagePartial.html @@ -0,0 +1,253 @@ + + + + +GMimeMessagePartial + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMessagePartial

+

GMimeMessagePartial — Partial MIME parts

+
+
+

Synopsis

+
struct              GMimeMessagePartial;
+GMimeMessagePartial * g_mime_message_partial_new        (const char *id,
+                                                         int number,
+                                                         int total);
+const char *        g_mime_message_partial_get_id       (GMimeMessagePartial *partial);
+int                 g_mime_message_partial_get_number   (GMimeMessagePartial *partial);
+int                 g_mime_message_partial_get_total    (GMimeMessagePartial *partial);
+GMimeMessage *      g_mime_message_partial_reconstruct_message
+                                                        (GMimeMessagePartial **partials,
+                                                         size_t num);
+GMimeMessage **     g_mime_message_partial_split_message
+                                                        (GMimeMessage *message,
+                                                         size_t max_size,
+                                                         size_t *nparts);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeObject
+         +----GMimePart
+               +----GMimeMessagePartial
+
+
+
+

Description

+

+A GMimeMessagePartial represents the message/partial MIME part. +

+
+
+

Details

+
+

struct GMimeMessagePartial

+
struct GMimeMessagePartial;
+

+A message/partial MIME part. +

+
++ +
+
+
+
+

g_mime_message_partial_new ()

+
GMimeMessagePartial * g_mime_message_partial_new        (const char *id,
+                                                         int number,
+                                                         int total);
+

+Creates a new MIME message/partial object. +

+
++ + + + + + + + + + + + + + + + + + +

id :

message/partial part id

number :

message/partial part number

total :

total number of message/partial parts

Returns :

an empty MIME message/partial object.
+
+
+
+

g_mime_message_partial_get_id ()

+
const char *        g_mime_message_partial_get_id       (GMimeMessagePartial *partial);
+

+Gets the message/partial id parameter value. +

+
++ + + + + + + + + + +

partial :

message/partial object

Returns :

the message/partial id or NULL on fail.
+
+
+
+

g_mime_message_partial_get_number ()

+
int                 g_mime_message_partial_get_number   (GMimeMessagePartial *partial);
+

+Gets the message/partial part number. +

+
++ + + + + + + + + + +

partial :

message/partial object

Returns :

the message/partial part number or -1 on fail.
+
+
+
+

g_mime_message_partial_get_total ()

+
int                 g_mime_message_partial_get_total    (GMimeMessagePartial *partial);
+

+Gets the total number of message/partial parts needed to +reconstruct the original message. +

+
++ + + + + + + + + + +

partial :

message/partial object

Returns :

the total number of message/partial parts needed to +reconstruct the original message or -1 on fail.
+
+
+
+

g_mime_message_partial_reconstruct_message ()

+
GMimeMessage *      g_mime_message_partial_reconstruct_message
+                                                        (GMimeMessagePartial **partials,
+                                                         size_t num);
+

+Reconstructs the GMimeMessage from the given message/partial parts +in partials. +

+
++ + + + + + + + + + + + + + +

partials :

an array of message/partial mime parts

num :

the number of elements in partials +

Returns :

a GMimeMessage object on success or NULL on fail.
+
+
+
+

g_mime_message_partial_split_message ()

+
GMimeMessage **     g_mime_message_partial_split_message
+                                                        (GMimeMessage *message,
+                                                         size_t max_size,
+                                                         size_t *nparts);
+

+Splits message into an array of GMimeMessage objects each +containing a single GMimeMessagePartial object containing +max_size bytes or fewer. nparts is set to the number of +GMimeMessagePartial objects created. +

+
++ + + + + + + + + + + + + + + + + + +

message :

message object

max_size :

max size

nparts :

number of parts

Returns :

an array of GMimeMessage objects and sets nparts to th +number of messages returned or NULL on fail.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeMultipart.html b/docs/reference/html/GMimeMultipart.html new file mode 100644 index 0000000..ca2a23f --- /dev/null +++ b/docs/reference/html/GMimeMultipart.html @@ -0,0 +1,600 @@ + + + + +GMimeMultipart + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMultipart

+

GMimeMultipart — MIME multiparts

+
+
+

Synopsis

+
struct              GMimeMultipart;
+GMimeMultipart *    g_mime_multipart_new                (void);
+GMimeMultipart *    g_mime_multipart_new_with_subtype   (const char *subtype);
+void                g_mime_multipart_set_preface        (GMimeMultipart *multipart,
+                                                         const char *preface);
+const char *        g_mime_multipart_get_preface        (GMimeMultipart *multipart);
+void                g_mime_multipart_set_postface       (GMimeMultipart *multipart,
+                                                         const char *postface);
+const char *        g_mime_multipart_get_postface       (GMimeMultipart *multipart);
+void                g_mime_multipart_set_boundary       (GMimeMultipart *multipart,
+                                                         const char *boundary);
+const char *        g_mime_multipart_get_boundary       (GMimeMultipart *multipart);
+int                 g_mime_multipart_get_count          (GMimeMultipart *multipart);
+gboolean            g_mime_multipart_contains           (GMimeMultipart *multipart,
+                                                         GMimeObject *part);
+int                 g_mime_multipart_index_of           (GMimeMultipart *multipart,
+                                                         GMimeObject *part);
+void                g_mime_multipart_add                (GMimeMultipart *multipart,
+                                                         GMimeObject *part);
+void                g_mime_multipart_clear              (GMimeMultipart *multipart);
+void                g_mime_multipart_insert             (GMimeMultipart *multipart,
+                                                         int index,
+                                                         GMimeObject *part);
+gboolean            g_mime_multipart_remove             (GMimeMultipart *multipart,
+                                                         GMimeObject *part);
+GMimeObject *       g_mime_multipart_remove_at          (GMimeMultipart *multipart,
+                                                         int index);
+GMimeObject *       g_mime_multipart_replace            (GMimeMultipart *multipart,
+                                                         int index,
+                                                         GMimeObject *replacement);
+GMimeObject *       g_mime_multipart_get_part           (GMimeMultipart *multipart,
+                                                         int index);
+void                g_mime_multipart_foreach            (GMimeMultipart *multipart,
+                                                         GMimeObjectForeachFunc callback,
+                                                         gpointer user_data);
+GMimeObject *       g_mime_multipart_get_subpart_from_content_id
+                                                        (GMimeMultipart *multipart,
+                                                         const char *content_id);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeObject
+         +----GMimeMultipart
+               +----GMimeMultipartEncrypted
+               +----GMimeMultipartSigned
+
+
+
+

Description

+

+A GMimeMultipart represents all multipart MIME container parts. +

+
+
+

Details

+
+

struct GMimeMultipart

+
struct GMimeMultipart;
+

+A base MIME multipart object. +

+
++ +
+
+
+
+

g_mime_multipart_new ()

+
GMimeMultipart *    g_mime_multipart_new                (void);
+

+Creates a new MIME multipart object with a default content-type of +multipart/mixed. +

+
++ + + + +

Returns :

an empty MIME multipart object with a default content-type of +multipart/mixed.
+
+
+
+

g_mime_multipart_new_with_subtype ()

+
GMimeMultipart *    g_mime_multipart_new_with_subtype   (const char *subtype);
+

+Creates a new MIME multipart object with a content-type of +multipart/subtype. +

+
++ + + + + + + + + + +

subtype :

content-type subtype

Returns :

an empty MIME multipart object with a content-type of +multipart/subtype.
+
+
+
+

g_mime_multipart_set_preface ()

+
void                g_mime_multipart_set_preface        (GMimeMultipart *multipart,
+                                                         const char *preface);
+

+Sets the preface on the multipart. +

+
++ + + + + + + + + + +

multipart :

a GMimeMultipart object

preface :

preface
+
+
+
+

g_mime_multipart_get_preface ()

+
const char *        g_mime_multipart_get_preface        (GMimeMultipart *multipart);
+

+Gets the preface on the multipart. +

+
++ + + + + + + + + + +

multipart :

a GMimeMultipart object

Returns :

a pointer to the preface string on the multipart.
+
+
+
+

g_mime_multipart_set_postface ()

+
void                g_mime_multipart_set_postface       (GMimeMultipart *multipart,
+                                                         const char *postface);
+

+Sets the postface on the multipart. +

+
++ + + + + + + + + + +

multipart :

a GMimeMultipart object

postface :

postface
+
+
+
+

g_mime_multipart_get_postface ()

+
const char *        g_mime_multipart_get_postface       (GMimeMultipart *multipart);
+

+Gets the postface on the multipart. +

+
++ + + + + + + + + + +

multipart :

a GMimeMultipart object

Returns :

a pointer to the postface string on the multipart.
+
+
+
+

g_mime_multipart_set_boundary ()

+
void                g_mime_multipart_set_boundary       (GMimeMultipart *multipart,
+                                                         const char *boundary);
+

+Sets boundary as the boundary on the multipart. If boundary is +NULL, then a boundary will be auto-generated for you. +

+
++ + + + + + + + + + +

multipart :

a GMimeMultipart object

boundary :

boundary or NULL to autogenerate one
+
+
+
+

g_mime_multipart_get_boundary ()

+
const char *        g_mime_multipart_get_boundary       (GMimeMultipart *multipart);
+

+Gets the boundary on the multipart. If the internal boundary is +NULL, then an auto-generated boundary will be set on the multipart +and returned. +

+
++ + + + + + + + + + +

multipart :

a GMimeMultipart object

Returns :

the boundary on the multipart.
+
+
+
+

g_mime_multipart_get_count ()

+
int                 g_mime_multipart_get_count          (GMimeMultipart *multipart);
+

+Gets the number of mime parts contained within the multipart. +

+
++ + + + + + + + + + +

multipart :

a GMimeMultipart object

Returns :

the number of mime parts contained within the multipart.
+
+
+
+

g_mime_multipart_contains ()

+
gboolean            g_mime_multipart_contains           (GMimeMultipart *multipart,
+                                                         GMimeObject *part);
+

+Checks if part is contained within multipart. +

+
++ + + + + + + + + + + + + + +

multipart :

a GMimeMultipart object

part :

mime part

Returns :

+TRUE if part is a subpart of multipart or FALSE +otherwise.
+
+
+
+

g_mime_multipart_index_of ()

+
int                 g_mime_multipart_index_of           (GMimeMultipart *multipart,
+                                                         GMimeObject *part);
+

+Gets the index of part within multipart. +

+
++ + + + + + + + + + + + + + +

multipart :

a GMimeMultipart object

part :

mime part

Returns :

the index of part within multipart or -1 if not found.
+
+
+
+

g_mime_multipart_add ()

+
void                g_mime_multipart_add                (GMimeMultipart *multipart,
+                                                         GMimeObject *part);
+

+Adds a mime part to the multipart. +

+
++ + + + + + + + + + +

multipart :

a GMimeMultipart object

part :

a GMimeObject +
+
+
+
+

g_mime_multipart_clear ()

+
void                g_mime_multipart_clear              (GMimeMultipart *multipart);
+

+Removes all subparts from multipart. +

+
++ + + + +

multipart :

a GMimeMultipart object
+
+
+
+

g_mime_multipart_insert ()

+
void                g_mime_multipart_insert             (GMimeMultipart *multipart,
+                                                         int index,
+                                                         GMimeObject *part);
+

+Inserts the specified mime part into the multipart at the position +index. +

+
++ + + + + + + + + + + + + + +

multipart :

a GMimeMultipart object

index :

position to insert the mime part

part :

mime part
+
+
+
+

g_mime_multipart_remove ()

+
gboolean            g_mime_multipart_remove             (GMimeMultipart *multipart,
+                                                         GMimeObject *part);
+

+Removes the specified mime part from the multipart. +

+
++ + + + + + + + + + + + + + +

multipart :

a GMimeMultipart object

part :

mime part

Returns :

+TRUE if the part was removed or FALSE otherwise.
+
+
+
+

g_mime_multipart_remove_at ()

+
GMimeObject *       g_mime_multipart_remove_at          (GMimeMultipart *multipart,
+                                                         int index);
+

+Removes the mime part at position index from the multipart. +

+
++ + + + + + + + + + + + + + +

multipart :

a GMimeMultipart object

index :

position of the mime part to remove

Returns :

the mime part that was removed or NULL if the part was +not contained within the multipart.
+
+
+
+

g_mime_multipart_replace ()

+
GMimeObject *       g_mime_multipart_replace            (GMimeMultipart *multipart,
+                                                         int index,
+                                                         GMimeObject *replacement);
+

+Replaces the mime part at position index within multipart with +replacement. +

+
++ + + + + + + + + + + + + + + + + + +

multipart :

a GMimeMultipart object

index :

position of the mime part to replace

replacement :

a GMimeObject to use as the replacement

Returns :

the mime part that was replaced or NULL if the part was +not contained within the multipart.
+
+
+
+

g_mime_multipart_get_part ()

+
GMimeObject *       g_mime_multipart_get_part           (GMimeMultipart *multipart,
+                                                         int index);
+

+Gets the mime part at position index within the multipart. +

+
++ + + + + + + + + + + + + + +

multipart :

a GMimeMultipart object

index :

position of the mime part

Returns :

the mime part at position index.
+
+
+
+

g_mime_multipart_foreach ()

+
void                g_mime_multipart_foreach            (GMimeMultipart *multipart,
+                                                         GMimeObjectForeachFunc callback,
+                                                         gpointer user_data);
+

+Recursively calls callback on each of multipart's subparts. +

+
++ + + + + + + + + + + + + + +

multipart :

a GMimeMultipart +

callback :

function to call for each of multipart's subparts.

user_data :

user-supplied callback data
+
+
+
+

g_mime_multipart_get_subpart_from_content_id ()

+
GMimeObject *       g_mime_multipart_get_subpart_from_content_id
+                                                        (GMimeMultipart *multipart,
+                                                         const char *content_id);
+

+Gets the mime part with the content-id content_id from the +multipart multipart. +

+
++ + + + + + + + + + + + + + +

multipart :

a multipart

content_id :

the content id of the part to look for

Returns :

the GMimeObject whose content-id matches the search string, +or NULL if a match cannot be found.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeMultipartEncrypted.html b/docs/reference/html/GMimeMultipartEncrypted.html new file mode 100644 index 0000000..5fab7c6 --- /dev/null +++ b/docs/reference/html/GMimeMultipartEncrypted.html @@ -0,0 +1,226 @@ + + + + +GMimeMultipartEncrypted + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMultipartEncrypted

+

GMimeMultipartEncrypted — Encrypted MIME multiparts

+
+
+

Synopsis

+
struct              GMimeMultipartEncrypted;
+GMimeMultipartEncrypted * g_mime_multipart_encrypted_new
+                                                        (void);
+int                 g_mime_multipart_encrypted_encrypt  (GMimeMultipartEncrypted *mpe,
+                                                         GMimeObject *content,
+                                                         GMimeCryptoContext *ctx,
+                                                         gboolean sign,
+                                                         const char *userid,
+                                                         GMimeDigestAlgo digest,
+                                                         GPtrArray *recipients,
+                                                         GError **err);
+GMimeObject *       g_mime_multipart_encrypted_decrypt  (GMimeMultipartEncrypted *mpe,
+                                                         GMimeCryptoContext *ctx,
+                                                         GMimeDecryptResult **result,
+                                                         GError **err);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeObject
+         +----GMimeMultipart
+               +----GMimeMultipartEncrypted
+
+
+
+

Description

+

+A GMimeMultipartEncrypted part is a special subclass of +GMimeMultipart to make it easier to manipulate the +multipart/encrypted MIME type. +

+
+
+

Details

+
+

struct GMimeMultipartEncrypted

+
struct GMimeMultipartEncrypted;
+

+A multipart/encrypted MIME part. +

+
++ +
+
+
+
+

g_mime_multipart_encrypted_new ()

+
GMimeMultipartEncrypted * g_mime_multipart_encrypted_new
+                                                        (void);
+

+Creates a new MIME multipart/encrypted object. +

+
++ + + + +

Returns :

an empty MIME multipart/encrypted object.
+
+
+
+

g_mime_multipart_encrypted_encrypt ()

+
int                 g_mime_multipart_encrypted_encrypt  (GMimeMultipartEncrypted *mpe,
+                                                         GMimeObject *content,
+                                                         GMimeCryptoContext *ctx,
+                                                         gboolean sign,
+                                                         const char *userid,
+                                                         GMimeDigestAlgo digest,
+                                                         GPtrArray *recipients,
+                                                         GError **err);
+

+Attempts to encrypt (and conditionally sign) the content MIME part +to the public keys of recipients using the ctx encryption +context. If successful, the encrypted GMimeObject is set as the +encrypted part of the multipart/encrypted object mpe. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

mpe :

multipart/encrypted object

content :

MIME part to encrypt

ctx :

encryption context

sign :

+TRUE if the content should also be signed or FALSE otherwise

userid :

user id to use for signing (only used if sign is TRUE)

digest :

digest algorithm to use when signing

recipients :

an array of recipients to encrypt to

err :

a GError +

Returns :

+0 on success or -1 on fail. If the encryption fails, an +exception will be set on err to provide information as to why the +failure occured.
+
+
+
+

g_mime_multipart_encrypted_decrypt ()

+
GMimeObject *       g_mime_multipart_encrypted_decrypt  (GMimeMultipartEncrypted *mpe,
+                                                         GMimeCryptoContext *ctx,
+                                                         GMimeDecryptResult **result,
+                                                         GError **err);
+

+Attempts to decrypt the encrypted MIME part contained within the +multipart/encrypted object mpe using the ctx decryption context. +

+

+If result is non-NULL, then on a successful decrypt operation, it will be +updated to point to a newly-allocated GMimeDecryptResult with signature +status information as well as a list of recipients that the part was +encrypted to. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

mpe :

multipart/encrypted object

ctx :

decryption context

result :

a GMimeDecryptionResult +

err :

a GError +

Returns :

the decrypted MIME part on success or NULL on fail. If the +decryption fails, an exception will be set on err to provide +information as to why the failure occured.
+
+
+
+

See Also

+GMimeMultipart +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeMultipartSigned.html b/docs/reference/html/GMimeMultipartSigned.html new file mode 100644 index 0000000..391158a --- /dev/null +++ b/docs/reference/html/GMimeMultipartSigned.html @@ -0,0 +1,196 @@ + + + + +GMimeMultipartSigned + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeMultipartSigned

+

GMimeMultipartSigned — Signed MIME multiparts

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeObject
+         +----GMimeMultipart
+               +----GMimeMultipartSigned
+
+
+
+

Description

+

+A GMimeMultipartSigned part is a special subclass of +GMimeMultipart to make it easier to manipulate the +multipart/signed MIME type. +

+
+
+

Details

+
+

struct GMimeMultipartSigned

+
struct GMimeMultipartSigned;
+

+A multipart/signed MIME part. +

+
++ +
+
+
+
+

g_mime_multipart_signed_new ()

+
GMimeMultipartSigned * g_mime_multipart_signed_new      (void);
+

+Creates a new MIME multipart/signed object. +

+
++ + + + +

Returns :

an empty MIME multipart/signed object.
+
+
+
+

g_mime_multipart_signed_sign ()

+
int                 g_mime_multipart_signed_sign        (GMimeMultipartSigned *mps,
+                                                         GMimeObject *content,
+                                                         GMimeCryptoContext *ctx,
+                                                         const char *userid,
+                                                         GMimeDigestAlgo digest,
+                                                         GError **err);
+

+Attempts to sign the content MIME part with userid's private key +using the ctx signing context with the digest algorithm. If +successful, the signed GMimeObject is set as the signed part of +the multipart/signed object mps. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

mps :

multipart/signed object

content :

MIME part to sign

ctx :

encryption crypto context

userid :

user id to sign with

digest :

preferred digest algorithm

err :

exception

Returns :

+0 on success or -1 on fail. If the signing fails, an +exception will be set on err to provide information as to why the +failure occured.
+
+
+
+

g_mime_multipart_signed_verify ()

+
GMimeSignatureList * g_mime_multipart_signed_verify     (GMimeMultipartSigned *mps,
+                                                         GMimeCryptoContext *ctx,
+                                                         GError **err);
+

+Attempts to verify the signed MIME part contained within the +multipart/signed object mps using the ctx crypto context. +

+
++ + + + + + + + + + + + + + + + + + +

mps :

multipart/signed object

ctx :

encryption crypto context

err :

exception

Returns :

a new GMimeSignatureList object on success or NULL on fail. If +the verification fails, an exception will be set on err to provide +information as to why the failure occured.
+
+
+
+

See Also

+GMimeMultipart +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeObject.html b/docs/reference/html/GMimeObject.html new file mode 100644 index 0000000..fdf9850 --- /dev/null +++ b/docs/reference/html/GMimeObject.html @@ -0,0 +1,831 @@ + + + + +GMimeObject + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeObject

+

GMimeObject — Abstract MIME objects

+
+
+

Synopsis

+
struct              GMimeObject;
+void                (*GMimeObjectForeachFunc)           (GMimeObject *parent,
+                                                         GMimeObject *part,
+                                                         gpointer user_data);
+void                g_mime_object_register_type         (const char *type,
+                                                         const char *subtype,
+                                                         GType object_type);
+GMimeObject *       g_mime_object_new                   (GMimeContentType *content_type);
+GMimeObject *       g_mime_object_new_type              (const char *type,
+                                                         const char *subtype);
+void                g_mime_object_set_content_type      (GMimeObject *object,
+                                                         GMimeContentType *content_type);
+GMimeContentType *  g_mime_object_get_content_type      (GMimeObject *object);
+void                g_mime_object_set_content_type_parameter
+                                                        (GMimeObject *object,
+                                                         const char *name,
+                                                         const char *value);
+const char *        g_mime_object_get_content_type_parameter
+                                                        (GMimeObject *object,
+                                                         const char *name);
+void                g_mime_object_set_disposition       (GMimeObject *object,
+                                                         const char *disposition);
+const char *        g_mime_object_get_disposition       (GMimeObject *object);
+void                g_mime_object_set_content_disposition
+                                                        (GMimeObject *object,
+                                                         GMimeContentDisposition *disposition);
+GMimeContentDisposition * g_mime_object_get_content_disposition
+                                                        (GMimeObject *object);
+void                g_mime_object_set_content_disposition_parameter
+                                                        (GMimeObject *object,
+                                                         const char *attribute,
+                                                         const char *value);
+const char *        g_mime_object_get_content_disposition_parameter
+                                                        (GMimeObject *object,
+                                                         const char *attribute);
+void                g_mime_object_set_content_id        (GMimeObject *object,
+                                                         const char *content_id);
+const char *        g_mime_object_get_content_id        (GMimeObject *object);
+void                g_mime_object_prepend_header        (GMimeObject *object,
+                                                         const char *header,
+                                                         const char *value);
+void                g_mime_object_append_header         (GMimeObject *object,
+                                                         const char *header,
+                                                         const char *value);
+gboolean            g_mime_object_remove_header         (GMimeObject *object,
+                                                         const char *header);
+void                g_mime_object_set_header            (GMimeObject *object,
+                                                         const char *header,
+                                                         const char *value);
+const char *        g_mime_object_get_header            (GMimeObject *object,
+                                                         const char *header);
+char *              g_mime_object_get_headers           (GMimeObject *object);
+GMimeHeaderList *   g_mime_object_get_header_list       (GMimeObject *object);
+ssize_t             g_mime_object_write_to_stream       (GMimeObject *object,
+                                                         GMimeStream *stream);
+char *              g_mime_object_to_string             (GMimeObject *object);
+void                g_mime_object_encode                (GMimeObject *object,
+                                                         GMimeEncodingConstraint constraint);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeObject
+         +----GMimeMessage
+         +----GMimePart
+         +----GMimeMultipart
+         +----GMimeMessagePart
+
+
+
+

Description

+

+GMimeObject is an abstract class from which all message and MIME +parts are derived. +

+
+
+

Details

+
+

struct GMimeObject

+
struct GMimeObject;
+

+Base class for all MIME parts. +

+
++ +
+
+
+
+

GMimeObjectForeachFunc ()

+
void                (*GMimeObjectForeachFunc)           (GMimeObject *parent,
+                                                         GMimeObject *part,
+                                                         gpointer user_data);
+

+The function signature for a callback to g_mime_message_foreach() +and g_mime_multipart_foreach(). +

+
++ + + + + + + + + + + + + + +

parent :

parent GMimeObject +

part :

a GMimeObject +

user_data :

User-supplied callback data.
+
+
+
+

g_mime_object_register_type ()

+
void                g_mime_object_register_type         (const char *type,
+                                                         const char *subtype,
+                                                         GType object_type);
+

+Registers the object type object_type for use with the +g_mime_object_new_type() convenience function. +

+

+Note: You may use the wildcard "*" to match any type and/or +subtype. +

+
++ + + + + + + + + + + + + + +

type :

mime type

subtype :

mime subtype

object_type :

object type
+
+
+
+

g_mime_object_new ()

+
GMimeObject *       g_mime_object_new                   (GMimeContentType *content_type);
+

+Performs a lookup of registered GMimeObject subclasses, registered +using g_mime_object_register_type(), to find an appropriate class +capable of handling MIME parts of the specified Content-Type. If no +class has been registered to handle that type, it looks for a +registered class that can handle content_type's media type. If +that also fails, then it will use the generic part class, +GMimePart. +

+
++ + + + + + + + + + +

content_type :

a GMimeContentType object

Returns :

an appropriate GMimeObject registered to handle MIME +parts appropriate for content_type.
+
+
+
+

g_mime_object_new_type ()

+
GMimeObject *       g_mime_object_new_type              (const char *type,
+                                                         const char *subtype);
+

+Performs a lookup of registered GMimeObject subclasses, registered +using g_mime_object_register_type(), to find an appropriate class +capable of handling MIME parts of type type/subtype. If no class +has been registered to handle that type, it looks for a registered +class that can handle type. If that also fails, then it will use +the generic part class, GMimePart. +

+
++ + + + + + + + + + + + + + +

type :

mime type

subtype :

mime subtype

Returns :

an appropriate GMimeObject registered to handle mime-types +of type/subtype.
+
+
+
+

g_mime_object_set_content_type ()

+
void                g_mime_object_set_content_type      (GMimeObject *object,
+                                                         GMimeContentType *content_type);
+

+Sets the content-type for the specified MIME object and then +serializes it to the Content-Type header field. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

content_type :

a GMimeContentType object
+
+
+
+

g_mime_object_get_content_type ()

+
GMimeContentType *  g_mime_object_get_content_type      (GMimeObject *object);
+

+Gets the GMimeContentType object for the given MIME object or +NULL on fail. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

Returns :

the content-type object for the specified MIME object.
+
+
+
+

g_mime_object_set_content_type_parameter ()

+
void                g_mime_object_set_content_type_parameter
+                                                        (GMimeObject *object,
+                                                         const char *name,
+                                                         const char *value);
+

+Sets the content-type param name to the value value. +

+
++ + + + + + + + + + + + + + +

object :

a GMimeObject +

name :

param name

value :

param value
+
+
+
+

g_mime_object_get_content_type_parameter ()

+
const char *        g_mime_object_get_content_type_parameter
+                                                        (GMimeObject *object,
+                                                         const char *name);
+

+Gets the value of the content-type param name set on the MIME part +object. +

+
++ + + + + + + + + + + + + + +

object :

a GMimeObject +

name :

param name

Returns :

the value of the requested content-type param or NULL on +if the param doesn't exist.
+
+
+
+

g_mime_object_set_disposition ()

+
void                g_mime_object_set_disposition       (GMimeObject *object,
+                                                         const char *disposition);
+

+Sets the disposition to disposition which may be one of +GMIME_DISPOSITION_ATTACHMENT or GMIME_DISPOSITION_INLINE or, by +your choice, any other string which would indicate how the MIME +part should be displayed by the MUA. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

disposition :

disposition ("attachment" or "inline")
+
+
+
+

g_mime_object_get_disposition ()

+
const char *        g_mime_object_get_disposition       (GMimeObject *object);
+

+Gets the MIME object's disposition if set or NULL otherwise. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

Returns :

the disposition string which is probably one of +GMIME_DISPOSITION_ATTACHMENT or GMIME_DISPOSITION_INLINE.
+
+
+
+

g_mime_object_set_content_disposition ()

+
void                g_mime_object_set_content_disposition
+                                                        (GMimeObject *object,
+                                                         GMimeContentDisposition *disposition);
+

+Set the content disposition for the specified mime part and then +serializes it to the Content-Disposition header field. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

disposition :

a GMimeContentDisposition object
+
+
+
+

g_mime_object_get_content_disposition ()

+
GMimeContentDisposition * g_mime_object_get_content_disposition
+                                                        (GMimeObject *object);
+

+Gets the GMimeContentDisposition for the specified MIME object. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

Returns :

the GMimeContentDisposition set on the MIME object.
+
+
+
+

g_mime_object_set_content_disposition_parameter ()

+
void                g_mime_object_set_content_disposition_parameter
+                                                        (GMimeObject *object,
+                                                         const char *attribute,
+                                                         const char *value);
+

+Add a content-disposition parameter to the specified mime part. +

+
++ + + + + + + + + + + + + + +

object :

a GMimeObject +

attribute :

parameter name

value :

parameter value
+
+
+
+

g_mime_object_get_content_disposition_parameter ()

+
const char *        g_mime_object_get_content_disposition_parameter
+                                                        (GMimeObject *object,
+                                                         const char *attribute);
+

+Gets the value of the Content-Disposition parameter specified by +attribute, or NULL if the parameter does not exist. +

+
++ + + + + + + + + + + + + + +

object :

a GMimeObject +

attribute :

parameter name

Returns :

the value of a previously defined content-disposition +parameter specified by attribute.
+
+
+
+

g_mime_object_set_content_id ()

+
void                g_mime_object_set_content_id        (GMimeObject *object,
+                                                         const char *content_id);
+

+Sets the Content-Id of the MIME object. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

content_id :

content-id (addr-spec portion)
+
+
+
+

g_mime_object_get_content_id ()

+
const char *        g_mime_object_get_content_id        (GMimeObject *object);
+

+Gets the Content-Id of the MIME object or NULL if one is not set. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

Returns :

a const pointer to the Content-Id header.
+
+
+
+

g_mime_object_prepend_header ()

+
void                g_mime_object_prepend_header        (GMimeObject *object,
+                                                         const char *header,
+                                                         const char *value);
+

+Prepends a raw, unprocessed header to the MIME object. +

+
++ + + + + + + + + + + + + + +

object :

a GMimeObject +

header :

header name

value :

header value
+
+
+
+

g_mime_object_append_header ()

+
void                g_mime_object_append_header         (GMimeObject *object,
+                                                         const char *header,
+                                                         const char *value);
+

+Appends a raw, unprocessed header to the MIME object. +

+
++ + + + + + + + + + + + + + +

object :

a GMimeObject +

header :

header name

value :

header value
+
+
+
+

g_mime_object_remove_header ()

+
gboolean            g_mime_object_remove_header         (GMimeObject *object,
+                                                         const char *header);
+

+Removed the specified header if it exists. +

+
++ + + + + + + + + + + + + + +

object :

a GMimeObject +

header :

header name

Returns :

+TRUE if the header was removed or FALSE if it could not +be found.
+
+
+
+

g_mime_object_set_header ()

+
void                g_mime_object_set_header            (GMimeObject *object,
+                                                         const char *header,
+                                                         const char *value);
+

+Sets an arbitrary raw, unprocessed header on the MIME object. +

+
++ + + + + + + + + + + + + + +

object :

a GMimeObject +

header :

header name

value :

header value
+
+
+
+

g_mime_object_get_header ()

+
const char *        g_mime_object_get_header            (GMimeObject *object,
+                                                         const char *header);
+

+Gets the raw, unprocessed value of the requested header. +

+
++ + + + + + + + + + + + + + +

object :

a GMimeObject +

header :

header name

Returns :

the raw, unprocessed value of the requested header if it +exists or NULL otherwise.
+
+
+
+

g_mime_object_get_headers ()

+
char *              g_mime_object_get_headers           (GMimeObject *object);
+

+Allocates a string buffer containing all of the MIME object's raw +headers. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

Returns :

an allocated string containing all of the raw MIME headers.
+
+
+
+

g_mime_object_get_header_list ()

+
GMimeHeaderList *   g_mime_object_get_header_list       (GMimeObject *object);
+

+Get the header list for object. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

Returns :

the GMimeHeaderList for object. Do not free this pointer +when you are done with it.
+
+
+
+

g_mime_object_write_to_stream ()

+
ssize_t             g_mime_object_write_to_stream       (GMimeObject *object,
+                                                         GMimeStream *stream);
+

+Write the contents of the MIME object to stream. +

+
++ + + + + + + + + + + + + + +

object :

a GMimeObject +

stream :

stream

Returns :

the number of bytes written or -1 on fail.
+
+
+
+

g_mime_object_to_string ()

+
char *              g_mime_object_to_string             (GMimeObject *object);
+

+Allocates a string buffer containing the contents of object. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

Returns :

an allocated string containing the contents of the mime +object.
+
+
+
+

g_mime_object_encode ()

+
void                g_mime_object_encode                (GMimeObject *object,
+                                                         GMimeEncodingConstraint constraint);
+

+Calculates and sets the most efficient Content-Transfer-Encoding +for this GMimeObject and all child parts based on the constraint +provided. +

+
++ + + + + + + + + + +

object :

a GMimeObject +

constraint :

a GMimeEncodingConstraint +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeParser.html b/docs/reference/html/GMimeParser.html new file mode 100644 index 0000000..e3f5692 --- /dev/null +++ b/docs/reference/html/GMimeParser.html @@ -0,0 +1,597 @@ + + + + +GMimeParser + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeParser

+

GMimeParser — Message and MIME part parser

+
+
+

Synopsis

+
struct              GMimeParser;
+void                (*GMimeParserHeaderRegexFunc)       (GMimeParser *parser,
+                                                         const char *header,
+                                                         const char *value,
+                                                         gint64 offset,
+                                                         gpointer user_data);
+GMimeParser *       g_mime_parser_new                   (void);
+GMimeParser *       g_mime_parser_new_with_stream       (GMimeStream *stream);
+void                g_mime_parser_init_with_stream      (GMimeParser *parser,
+                                                         GMimeStream *stream);
+gboolean            g_mime_parser_get_persist_stream    (GMimeParser *parser);
+void                g_mime_parser_set_persist_stream    (GMimeParser *parser,
+                                                         gboolean persist);
+gboolean            g_mime_parser_get_scan_from         (GMimeParser *parser);
+void                g_mime_parser_set_scan_from         (GMimeParser *parser,
+                                                         gboolean scan_from);
+gboolean            g_mime_parser_get_respect_content_length
+                                                        (GMimeParser *parser);
+void                g_mime_parser_set_respect_content_length
+                                                        (GMimeParser *parser,
+                                                         gboolean respect_content_length);
+void                g_mime_parser_set_header_regex      (GMimeParser *parser,
+                                                         const char *regex,
+                                                         GMimeParserHeaderRegexFunc header_cb,
+                                                         gpointer user_data);
+gint64              g_mime_parser_tell                  (GMimeParser *parser);
+gboolean            g_mime_parser_eos                   (GMimeParser *parser);
+GMimeObject *       g_mime_parser_construct_part        (GMimeParser *parser);
+GMimeMessage *      g_mime_parser_construct_message     (GMimeParser *parser);
+char *              g_mime_parser_get_from              (GMimeParser *parser);
+gint64              g_mime_parser_get_from_offset       (GMimeParser *parser);
+gint64              g_mime_parser_get_headers_begin     (GMimeParser *parser);
+gint64              g_mime_parser_get_headers_end       (GMimeParser *parser);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeParser
+
+
+
+

Description

+

+A GMimeParser parses a stream into a GMimeMessage or other +GMimeObject and can also handle parsing MBox formatted streams +into multiple GMimeMessage objects. +

+
+
+

Details

+
+

struct GMimeParser

+
struct GMimeParser;
+

+A MIME parser context. +

+
++ +
+
+
+
+

GMimeParserHeaderRegexFunc ()

+
void                (*GMimeParserHeaderRegexFunc)       (GMimeParser *parser,
+                                                         const char *header,
+                                                         const char *value,
+                                                         gint64 offset,
+                                                         gpointer user_data);
+

+Function signature for the callback to +g_mime_parser_set_header_regex(). +

+
++ + + + + + + + + + + + + + + + + + + + + + +

parser :

The GMimeParser object.

header :

The header field matched.

value :

The header field value.

offset :

The header field offset.

user_data :

The user-supplied callback data.
+
+
+
+

g_mime_parser_new ()

+
GMimeParser *       g_mime_parser_new                   (void);
+

+Creates a new parser object. +

+
++ + + + +

Returns :

a new parser object.
+
+
+
+

g_mime_parser_new_with_stream ()

+
GMimeParser *       g_mime_parser_new_with_stream       (GMimeStream *stream);
+

+Creates a new parser object preset to parse stream. +

+
++ + + + + + + + + + +

stream :

raw message or part stream

Returns :

a new parser object.
+
+
+
+

g_mime_parser_init_with_stream ()

+
void                g_mime_parser_init_with_stream      (GMimeParser *parser,
+                                                         GMimeStream *stream);
+

+Initializes parser to use stream. +

+

+WARNING: Initializing a parser with a stream is comparable to +selling your soul (stream) to the devil (parser). You are +basically giving the parser complete control of the stream, this +means that you had better not touch the stream so long as the +parser is still using it. This means no reading, writing, seeking, +or resetting of the stream. Anything that will/could change the +current stream's offset is PROHIBITED. +

+

+It is also recommended that you not use g_mime_stream_tell() +because it will not necessarily give you the current parser offset +since parser handles its own internal read-ahead buffer. Instead, +it is recommended that you use g_mime_parser_tell() if you have a +reason to need the current offset of the parser. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

stream :

raw message or part stream
+
+
+
+

g_mime_parser_get_persist_stream ()

+
gboolean            g_mime_parser_get_persist_stream    (GMimeParser *parser);
+

+Gets whether or not the underlying stream is persistent. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

+TRUE if the parser will leave the content on disk or +FALSE if it will load the content into memory.
+
+
+
+

g_mime_parser_set_persist_stream ()

+
void                g_mime_parser_set_persist_stream    (GMimeParser *parser,
+                                                         gboolean persist);
+

+Sets whether or not the parser's underlying stream is persistent. +

+

+If persist is TRUE, the parser will attempt to construct +messages/parts whose content will remain on disk rather than being +loaded into memory so as to reduce memory usage. This is the default. +

+

+If persist is FALSE, the parser will always load message content +into memory. +

+

+Note: This attribute only serves as a hint to the parser. If the +underlying stream does not support seeking, then this attribute +will be ignored. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

persist :

persist attribute
+
+
+
+

g_mime_parser_get_scan_from ()

+
gboolean            g_mime_parser_get_scan_from         (GMimeParser *parser);
+

+Gets whether or not parser is set to scan mbox-style From-lines. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

whether or not parser is set to scan mbox-style +From-lines.
+
+
+
+

g_mime_parser_set_scan_from ()

+
void                g_mime_parser_set_scan_from         (GMimeParser *parser,
+                                                         gboolean scan_from);
+

+Sets whether or not parser should scan mbox-style From-lines. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

scan_from :

+TRUE to scan From-lines or FALSE otherwise
+
+
+
+

g_mime_parser_get_respect_content_length ()

+
gboolean            g_mime_parser_get_respect_content_length
+                                                        (GMimeParser *parser);
+

+Gets whether or not parser is set to use Content-Length for +determining the offset of the end of the message. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

whether or not parser is set to use Content-Length for +determining the offset of the end of the message.
+
+
+
+

g_mime_parser_set_respect_content_length ()

+
void                g_mime_parser_set_respect_content_length
+                                                        (GMimeParser *parser,
+                                                         gboolean respect_content_length);
+

+Sets whether or not parser should respect Content-Length headers +when deciding where to look for the start of the next message. Only +used when the parser is also set to scan for From-lines. +

+

+Most notably useful when parsing broken Solaris mbox files (See +http://www.jwz.org/doc/content-length.html for details). +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

respect_content_length :

+TRUE if the parser should use Content-Length headers or FALSE otherwise.
+
+
+
+

g_mime_parser_set_header_regex ()

+
void                g_mime_parser_set_header_regex      (GMimeParser *parser,
+                                                         const char *regex,
+                                                         GMimeParserHeaderRegexFunc header_cb,
+                                                         gpointer user_data);
+

+Sets the regular expression pattern regex on parser. Whenever a +header matching the pattern regex is parsed, header_cb is called +with user_data as the user_data argument. +

+

+If regex is NULL, then the previously registered regex callback +is unregistered and no new callback is set. +

+
++ + + + + + + + + + + + + + + + + + +

parser :

a GMimeParser context

regex :

regular expression

header_cb :

callback function

user_data :

user data
+
+
+
+

g_mime_parser_tell ()

+
gint64              g_mime_parser_tell                  (GMimeParser *parser);
+

+Gets the current stream offset from the parser's internal stream. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

the current stream offset from the parser's internal stream +or -1 on error.
+
+
+
+

g_mime_parser_eos ()

+
gboolean            g_mime_parser_eos                   (GMimeParser *parser);
+

+Tests the end-of-stream indicator for parser's internal stream. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

+TRUE on EOS or FALSE otherwise.
+
+
+
+

g_mime_parser_construct_part ()

+
GMimeObject *       g_mime_parser_construct_part        (GMimeParser *parser);
+

+Constructs a MIME part from parser. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

a MIME part based on parser or NULL on fail.
+
+
+
+

g_mime_parser_construct_message ()

+
GMimeMessage *      g_mime_parser_construct_message     (GMimeParser *parser);
+

+Constructs a MIME message from parser. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

a MIME message or NULL on fail.
+
+
+
+

g_mime_parser_get_from ()

+
char *              g_mime_parser_get_from              (GMimeParser *parser);
+

+Gets the mbox-style From-line of the most recently parsed message +(gotten from g_mime_parser_construct_message()). +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

the mbox-style From-line of the most recently parsed +message or NULL on error.
+
+
+
+

g_mime_parser_get_from_offset ()

+
gint64              g_mime_parser_get_from_offset       (GMimeParser *parser);
+

+Gets the offset of the most recently parsed mbox-style From-line +(gotten from g_mime_parser_construct_message()). +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

the offset of the most recently parsed mbox-style From-line +or -1 on error.
+
+
+
+

g_mime_parser_get_headers_begin ()

+
gint64              g_mime_parser_get_headers_begin     (GMimeParser *parser);
+

+Gets the stream offset of the beginning of the headers of the most +recently parsed message. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

the offset of the beginning of the headers of the most +recently parsed message or -1 on error.
+
+
+
+

g_mime_parser_get_headers_end ()

+
gint64              g_mime_parser_get_headers_end       (GMimeParser *parser);
+

+Gets the stream offset of the end of the headers of the most +recently parsed message. +

+
++ + + + + + + + + + +

parser :

a GMimeParser context

Returns :

the offset of the end of the headers of the most recently +parsed message or -1 on error.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimePart.html b/docs/reference/html/GMimePart.html new file mode 100644 index 0000000..1d6b778 --- /dev/null +++ b/docs/reference/html/GMimePart.html @@ -0,0 +1,514 @@ + + + + +GMimePart + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimePart

+

GMimePart — MIME parts

+
+
+

Synopsis

+
struct              GMimePart;
+GMimePart *         g_mime_part_new                     (void);
+GMimePart *         g_mime_part_new_with_type           (const char *type,
+                                                         const char *subtype);
+void                g_mime_part_set_content_description (GMimePart *mime_part,
+                                                         const char *description);
+const char *        g_mime_part_get_content_description (GMimePart *mime_part);
+void                g_mime_part_set_content_id          (GMimePart *mime_part,
+                                                         const char *content_id);
+const char *        g_mime_part_get_content_id          (GMimePart *mime_part);
+void                g_mime_part_set_content_md5         (GMimePart *mime_part,
+                                                         const char *content_md5);
+const char *        g_mime_part_get_content_md5         (GMimePart *mime_part);
+gboolean            g_mime_part_verify_content_md5      (GMimePart *mime_part);
+void                g_mime_part_set_content_location    (GMimePart *mime_part,
+                                                         const char *content_location);
+const char *        g_mime_part_get_content_location    (GMimePart *mime_part);
+void                g_mime_part_set_content_encoding    (GMimePart *mime_part,
+                                                         GMimeContentEncoding encoding);
+GMimeContentEncoding g_mime_part_get_content_encoding   (GMimePart *mime_part);
+GMimeContentEncoding g_mime_part_get_best_content_encoding
+                                                        (GMimePart *mime_part,
+                                                         GMimeEncodingConstraint constraint);
+void                g_mime_part_set_filename            (GMimePart *mime_part,
+                                                         const char *filename);
+const char *        g_mime_part_get_filename            (GMimePart *mime_part);
+GMimeDataWrapper *  g_mime_part_get_content_object      (GMimePart *mime_part);
+void                g_mime_part_set_content_object      (GMimePart *mime_part,
+                                                         GMimeDataWrapper *content);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeObject
+         +----GMimePart
+               +----GMimeMessagePartial
+
+
+
+

Description

+

+A GMimePart represents any MIME leaf part (meaning it has no +sub-parts). +

+
+
+

Details

+
+

struct GMimePart

+
struct GMimePart;
+

+A leaf-node MIME part object. +

+
++ +
+
+
+
+

g_mime_part_new ()

+
GMimePart *         g_mime_part_new                     (void);
+

+Creates a new MIME Part object with a default content-type of +text/plain. +

+
++ + + + +

Returns :

an empty MIME Part object with a default content-type of +text/plain.
+
+
+
+

g_mime_part_new_with_type ()

+
GMimePart *         g_mime_part_new_with_type           (const char *type,
+                                                         const char *subtype);
+

+Creates a new MIME Part with a sepcified type. +

+
++ + + + + + + + + + + + + + +

type :

content-type string

subtype :

content-subtype string

Returns :

an empty MIME Part object with the specified content-type.
+
+
+
+

g_mime_part_set_content_description ()

+
void                g_mime_part_set_content_description (GMimePart *mime_part,
+                                                         const char *description);
+

+Set the content description for the specified mime part. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

description :

content description
+
+
+
+

g_mime_part_get_content_description ()

+
const char *        g_mime_part_get_content_description (GMimePart *mime_part);
+

+Gets the value of the Content-Description for the specified mime +part if it exists or NULL otherwise. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

Returns :

the content description for the specified mime part.
+
+
+
+

g_mime_part_set_content_id ()

+
void                g_mime_part_set_content_id          (GMimePart *mime_part,
+                                                         const char *content_id);
+

+Set the content id for the specified mime part. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

content_id :

content id
+
+
+
+

g_mime_part_get_content_id ()

+
const char *        g_mime_part_get_content_id          (GMimePart *mime_part);
+

+Gets the content-id of the specified mime part if it exists, or +NULL otherwise. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

Returns :

the content id for the specified mime part.
+
+
+
+

g_mime_part_set_content_md5 ()

+
void                g_mime_part_set_content_md5         (GMimePart *mime_part,
+                                                         const char *content_md5);
+

+Set the content md5 for the specified mime part. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

content_md5 :

content md5 or NULL to generate the md5 digest.
+
+
+
+

g_mime_part_get_content_md5 ()

+
const char *        g_mime_part_get_content_md5         (GMimePart *mime_part);
+

+Gets the md5sum contained in the Content-Md5 header of the +specified mime part if it exists, or NULL otherwise. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

Returns :

the content md5 for the specified mime part.
+
+
+
+

g_mime_part_verify_content_md5 ()

+
gboolean            g_mime_part_verify_content_md5      (GMimePart *mime_part);
+

+Verify the content md5 for the specified mime part. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

Returns :

+TRUE if the md5 is valid or FALSE otherwise. Note: will +return FALSE if the mime part does not contain a Content-MD5.
+
+
+
+

g_mime_part_set_content_location ()

+
void                g_mime_part_set_content_location    (GMimePart *mime_part,
+                                                         const char *content_location);
+

+Set the content location for the specified mime part. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

content_location :

content location
+
+
+
+

g_mime_part_get_content_location ()

+
const char *        g_mime_part_get_content_location    (GMimePart *mime_part);
+

+Gets the value of the Content-Location header if it exists, or +NULL otherwise. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

Returns :

the content location for the specified mime part.
+
+
+
+

g_mime_part_set_content_encoding ()

+
void                g_mime_part_set_content_encoding    (GMimePart *mime_part,
+                                                         GMimeContentEncoding encoding);
+

+Set the content encoding for the specified mime part. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

encoding :

a GMimeContentEncoding +
+
+
+
+

g_mime_part_get_content_encoding ()

+
GMimeContentEncoding g_mime_part_get_content_encoding   (GMimePart *mime_part);
+

+Gets the content encoding of the mime part. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

Returns :

the content encoding for the specified mime part.
+
+
+
+

g_mime_part_get_best_content_encoding ()

+
GMimeContentEncoding g_mime_part_get_best_content_encoding
+                                                        (GMimePart *mime_part,
+                                                         GMimeEncodingConstraint constraint);
+

+Calculates the most efficient content encoding for the mime_part +given the constraint. +

+
++ + + + + + + + + + + + + + +

mime_part :

a GMimePart object

constraint :

a GMimeEncodingConstraint +

Returns :

the best content encoding for the specified mime part.
+
+
+
+

g_mime_part_set_filename ()

+
void                g_mime_part_set_filename            (GMimePart *mime_part,
+                                                         const char *filename);
+

+Sets the "filename" parameter on the Content-Disposition and also sets the +"name" parameter on the Content-Type. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

filename :

the filename of the Mime Part's content
+
+
+
+

g_mime_part_get_filename ()

+
const char *        g_mime_part_get_filename            (GMimePart *mime_part);
+

+Gets the filename of the specificed mime part, or NULL if the mime +part does not have the filename or name parameter set. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

Returns :

the filename of the specified MIME Part. It first checks to +see if the "filename" parameter was set on the Content-Disposition +and if not then checks the "name" parameter in the Content-Type.
+
+
+
+

g_mime_part_get_content_object ()

+
GMimeDataWrapper *  g_mime_part_get_content_object      (GMimePart *mime_part);
+

+Gets the internal data-wrapper of the specified mime part, or NULL +on error. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

Returns :

the data-wrapper for the mime part's contents.
+
+
+
+

g_mime_part_set_content_object ()

+
void                g_mime_part_set_content_object      (GMimePart *mime_part,
+                                                         GMimeDataWrapper *content);
+

+Sets the content object on the mime part. +

+
++ + + + + + + + + + +

mime_part :

a GMimePart object

content :

a GMimeDataWrapper content object
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimePkcs7Context.html b/docs/reference/html/GMimePkcs7Context.html new file mode 100644 index 0000000..ab12a55 --- /dev/null +++ b/docs/reference/html/GMimePkcs7Context.html @@ -0,0 +1,158 @@ + + + + +GMimePkcs7Context + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimePkcs7Context

+

GMimePkcs7Context — PKCS7 crypto contexts

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeCryptoContext
+         +----GMimePkcs7Context
+
+
+
+

Description

+

+A GMimePkcs7Context is a GMimeCryptoContext that uses GnuPG to do +all of the encryption and digital signatures. +

+
+
+

Details

+
+

struct GMimePkcs7Context

+
struct GMimePkcs7Context;
+

+A PKCS7 crypto context. +

+
++ +
+
+
+
+

g_mime_pkcs7_context_new ()

+
GMimeCryptoContext * g_mime_pkcs7_context_new           (GMimePasswordRequestFunc request_passwd);
+

+Creates a new pkcs7 crypto context object. +

+
++ + + + + + + + + + +

request_passwd :

a GMimePasswordRequestFunc +

Returns :

a new pkcs7 crypto context object.
+
+
+
+

g_mime_pkcs7_context_get_always_trust ()

+
gboolean            g_mime_pkcs7_context_get_always_trust
+                                                        (GMimePkcs7Context *ctx);
+

+Gets the always_trust flag on the pkcs7 context. +

+
++ + + + + + + + + + +

ctx :

a GMimePkcs7Context +

Returns :

the always_trust flag on the pkcs7 context.
+
+
+
+

g_mime_pkcs7_context_set_always_trust ()

+
void                g_mime_pkcs7_context_set_always_trust
+                                                        (GMimePkcs7Context *ctx,
+                                                         gboolean always_trust);
+

+Sets the always_trust flag on the pkcs7 context which is used for +encryption. +

+
++ + + + + + + + + + +

ctx :

a GMimePkcs7Context +

always_trust :

always trust flag
+
+
+
+

See Also

+GMimeCryptoContext +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeSignature.html b/docs/reference/html/GMimeSignature.html new file mode 100644 index 0000000..5a18b45 --- /dev/null +++ b/docs/reference/html/GMimeSignature.html @@ -0,0 +1,754 @@ + + + + +GMimeSignature + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeSignature

+

GMimeSignature — Digital signatures

+
+
+

Synopsis

+
enum                GMimeSignatureStatus;
+enum                GMimeSignatureError;
+struct              GMimeSignature;
+GMimeSignature *    g_mime_signature_new                (void);
+GMimeCertificate *  g_mime_signature_get_certificate    (GMimeSignature *sig);
+void                g_mime_signature_set_certificate    (GMimeSignature *sig,
+                                                         GMimeCertificate *cert);
+GMimeSignatureStatus g_mime_signature_get_status        (GMimeSignature *sig);
+void                g_mime_signature_set_status         (GMimeSignature *sig,
+                                                         GMimeSignatureStatus status);
+GMimeSignatureError g_mime_signature_get_errors         (GMimeSignature *sig);
+void                g_mime_signature_set_errors         (GMimeSignature *sig,
+                                                         GMimeSignatureError errors);
+time_t              g_mime_signature_get_created        (GMimeSignature *sig);
+void                g_mime_signature_set_created        (GMimeSignature *sig,
+                                                         time_t created);
+time_t              g_mime_signature_get_expires        (GMimeSignature *sig);
+void                g_mime_signature_set_expires        (GMimeSignature *sig,
+                                                         time_t expires);
+
+struct              GMimeSignatureList;
+GMimeSignatureList * g_mime_signature_list_new          (void);
+int                 g_mime_signature_list_length        (GMimeSignatureList *list);
+void                g_mime_signature_list_clear         (GMimeSignatureList *list);
+int                 g_mime_signature_list_add           (GMimeSignatureList *list,
+                                                         GMimeSignature *sig);
+void                g_mime_signature_list_insert        (GMimeSignatureList *list,
+                                                         int index,
+                                                         GMimeSignature *sig);
+gboolean            g_mime_signature_list_remove        (GMimeSignatureList *list,
+                                                         GMimeSignature *sig);
+gboolean            g_mime_signature_list_remove_at     (GMimeSignatureList *list,
+                                                         int index);
+gboolean            g_mime_signature_list_contains      (GMimeSignatureList *list,
+                                                         GMimeSignature *sig);
+int                 g_mime_signature_list_index_of      (GMimeSignatureList *list,
+                                                         GMimeSignature *sig);
+GMimeSignature *    g_mime_signature_list_get_signature (GMimeSignatureList *list,
+                                                         int index);
+void                g_mime_signature_list_set_signature (GMimeSignatureList *list,
+                                                         int index,
+                                                         GMimeSignature *sig);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeSignature
+
+
+  GObject
+   +----GMimeSignatureList
+
+
+
+

Description

+

+A GMimeSignature is an object containing useful information about a +digital signature as used in signing and encrypting data. +

+
+
+

Details

+
+

enum GMimeSignatureStatus

+
typedef enum {
+	GMIME_SIGNATURE_STATUS_GOOD,
+	GMIME_SIGNATURE_STATUS_ERROR,
+	GMIME_SIGNATURE_STATUS_BAD
+} GMimeSignatureStatus;
+
+

+A value representing the signature status for a particular +GMimeSignature. +

+
++ + + + + + + + + + + + + + +

GMIME_SIGNATURE_STATUS_GOOD

Good signature. +

GMIME_SIGNATURE_STATUS_ERROR

An error occurred. +

GMIME_SIGNATURE_STATUS_BAD

Bad signature. +
+
+
+
+

enum GMimeSignatureError

+
typedef enum {
+	GMIME_SIGNATURE_ERROR_NONE        = 0,
+	GMIME_SIGNATURE_ERROR_EXPSIG      = (1 << 0),  /* expired signature */
+	GMIME_SIGNATURE_ERROR_NO_PUBKEY   = (1 << 1),  /* no public key */
+	GMIME_SIGNATURE_ERROR_EXPKEYSIG   = (1 << 2),  /* expired key */
+	GMIME_SIGNATURE_ERROR_REVKEYSIG   = (1 << 3),  /* revoked key */
+	GMIME_SIGNATURE_ERROR_UNSUPP_ALGO = (1 << 4)   /* unsupported algorithm */
+} GMimeSignatureError;
+
+

+Possible errors that a GMimeSignature could have. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_SIGNATURE_ERROR_NONE

No error. +

GMIME_SIGNATURE_ERROR_EXPSIG

Expired signature. +

GMIME_SIGNATURE_ERROR_NO_PUBKEY

No public key found. +

GMIME_SIGNATURE_ERROR_EXPKEYSIG

Expired signature key. +

GMIME_SIGNATURE_ERROR_REVKEYSIG

Revoked signature key. +

GMIME_SIGNATURE_ERROR_UNSUPP_ALGO

Unsupported algorithm. +
+
+
+
+

struct GMimeSignature

+
struct GMimeSignature;
+

+An object containing useful information about a signature. +

+
++ +
+
+
+
+

g_mime_signature_new ()

+
GMimeSignature *    g_mime_signature_new                (void);
+

+Creates a new GMimeSignature object. +

+
++ + + + +

Returns :

a new GMimeSignature object.
+
+
+
+

g_mime_signature_get_certificate ()

+
GMimeCertificate *  g_mime_signature_get_certificate    (GMimeSignature *sig);
+

+Get the signature's certificate. +

+
++ + + + + + + + + + +

sig :

a GMimeSignature +

Returns :

the signature's certificate.
+
+
+
+

g_mime_signature_set_certificate ()

+
void                g_mime_signature_set_certificate    (GMimeSignature *sig,
+                                                         GMimeCertificate *cert);
+

+Set the signature's certificate. +

+
++ + + + + + + + + + +

sig :

a GMimeSignature +

cert :

a GMimeCertificate +
+
+
+
+

g_mime_signature_get_status ()

+
GMimeSignatureStatus g_mime_signature_get_status        (GMimeSignature *sig);
+

+Get the signature status. +

+
++ + + + + + + + + + +

sig :

a GMimeSignature +

Returns :

the signature status.
+
+
+
+

g_mime_signature_set_status ()

+
void                g_mime_signature_set_status         (GMimeSignature *sig,
+                                                         GMimeSignatureStatus status);
+

+Set the status on the signature. +

+
++ + + + + + + + + + +

sig :

a GMimeSignature +

status :

a GMimeSignatureStatus +
+
+
+
+

g_mime_signature_get_errors ()

+
GMimeSignatureError g_mime_signature_get_errors         (GMimeSignature *sig);
+

+Get the signature errors. If the GMimeSignatureStatus returned from +g_mime_signature_get_status() is not GMIME_SIGNATURE_STATUS_GOOD, then the +errors may provide a clue as to why. +

+
++ + + + + + + + + + +

sig :

a GMimeSignature +

Returns :

a bitfield of errors.
+
+
+
+

g_mime_signature_set_errors ()

+
void                g_mime_signature_set_errors         (GMimeSignature *sig,
+                                                         GMimeSignatureError errors);
+

+Set the errors on the signature. +

+
++ + + + + + + + + + +

sig :

a GMimeSignature +

errors :

a GMimeSignatureError +
+
+
+
+

g_mime_signature_get_created ()

+
time_t              g_mime_signature_get_created        (GMimeSignature *sig);
+

+Get the creation date of the signature. +

+
++ + + + + + + + + + +

sig :

a GMimeSignature +

Returns :

the creation date of the signature or -1 if unknown.
+
+
+
+

g_mime_signature_set_created ()

+
void                g_mime_signature_set_created        (GMimeSignature *sig,
+                                                         time_t created);
+

+Set the creation date of the signature. +

+
++ + + + + + + + + + +

sig :

a GMimeSignature +

created :

creation date
+
+
+
+

g_mime_signature_get_expires ()

+
time_t              g_mime_signature_get_expires        (GMimeSignature *sig);
+

+Get the expiration date of the signature. +

+
++ + + + + + + + + + +

sig :

a GMimeSignature +

Returns :

the expiration date of the signature or -1 if unknown.
+
+
+
+

g_mime_signature_set_expires ()

+
void                g_mime_signature_set_expires        (GMimeSignature *sig,
+                                                         time_t expires);
+

+Set the expiration date of the signature. +

+
++ + + + + + + + + + +

sig :

a GMimeSignature +

expires :

expiration date
+
+
+
+

struct GMimeSignatureList

+
struct GMimeSignatureList;
+

+A collection of GMimeSignature objects. +

+
++ +
+
+
+
+

g_mime_signature_list_new ()

+
GMimeSignatureList * g_mime_signature_list_new          (void);
+

+Creates a new GMimeSignatureList. +

+
++ + + + +

Returns :

a new GMimeSignatureList.
+
+
+
+

g_mime_signature_list_length ()

+
int                 g_mime_signature_list_length        (GMimeSignatureList *list);
+

+Gets the length of the list. +

+
++ + + + + + + + + + +

list :

a GMimeSignatureList +

Returns :

the number of GMimeSignature objects in the list.
+
+
+
+

g_mime_signature_list_clear ()

+
void                g_mime_signature_list_clear         (GMimeSignatureList *list);
+

+Clears the list of addresses. +

+
++ + + + +

list :

a GMimeSignatureList +
+
+
+
+

g_mime_signature_list_add ()

+
int                 g_mime_signature_list_add           (GMimeSignatureList *list,
+                                                         GMimeSignature *sig);
+

+Adds a GMimeSignature to the GMimeSignatureList. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeSignatureList +

sig :

a GMimeSignature +

Returns :

the index of the added GMimeSignature.
+
+
+
+

g_mime_signature_list_insert ()

+
void                g_mime_signature_list_insert        (GMimeSignatureList *list,
+                                                         int index,
+                                                         GMimeSignature *sig);
+

+Inserts a GMimeSignature into the GMimeSignatureList at the specified +index. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeSignatureList +

index :

index to insert at

sig :

a GMimeSignature +
+
+
+
+

g_mime_signature_list_remove ()

+
gboolean            g_mime_signature_list_remove        (GMimeSignatureList *list,
+                                                         GMimeSignature *sig);
+

+Removes a GMimeSignature from the GMimeSignatureList. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeSignatureList +

sig :

a GMimeSignature +

Returns :

+TRUE if the specified GMimeSignature was removed or FALSE +otherwise.
+
+
+
+

g_mime_signature_list_remove_at ()

+
gboolean            g_mime_signature_list_remove_at     (GMimeSignatureList *list,
+                                                         int index);
+

+Removes a GMimeSignature from the GMimeSignatureList at the specified +index. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeSignatureList +

index :

index to remove

Returns :

+TRUE if an GMimeSignature was removed or FALSE otherwise.
+
+
+
+

g_mime_signature_list_contains ()

+
gboolean            g_mime_signature_list_contains      (GMimeSignatureList *list,
+                                                         GMimeSignature *sig);
+

+Checks whether or not the specified GMimeSignature is contained within +the GMimeSignatureList. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeSignatureList +

sig :

a GMimeSignature +

Returns :

+TRUE if the specified GMimeSignature is contained within the +specified GMimeSignatureList or FALSE otherwise.
+
+
+
+

g_mime_signature_list_index_of ()

+
int                 g_mime_signature_list_index_of      (GMimeSignatureList *list,
+                                                         GMimeSignature *sig);
+

+Gets the index of the specified GMimeSignature inside the +GMimeSignatureList. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeSignatureList +

sig :

a GMimeSignature +

Returns :

the index of the requested GMimeSignature within the +GMimeSignatureList or -1 if it is not contained within the +GMimeSignatureList.
+
+
+
+

g_mime_signature_list_get_signature ()

+
GMimeSignature *    g_mime_signature_list_get_signature (GMimeSignatureList *list,
+                                                         int index);
+

+Gets the GMimeSignature at the specified index. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeSignatureList +

index :

index of GMimeSignature to get

Returns :

the GMimeSignature at the specified index or NULL if +the index is out of range.
+
+
+
+

g_mime_signature_list_set_signature ()

+
void                g_mime_signature_list_set_signature (GMimeSignatureList *list,
+                                                         int index,
+                                                         GMimeSignature *sig);
+

+Sets the GMimeSignature at the specified index to sig. +

+
++ + + + + + + + + + + + + + +

list :

a GMimeSignatureList +

index :

index of GMimeSignature to set

sig :

a GMimeSignature +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeStream.html b/docs/reference/html/GMimeStream.html new file mode 100644 index 0000000..3666047 --- /dev/null +++ b/docs/reference/html/GMimeStream.html @@ -0,0 +1,631 @@ + + + + +GMimeStream + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStream

+

GMimeStream — Abstract stream class

+
+
+

Synopsis

+
enum                GMimeSeekWhence;
+                    GMimeStreamIOVector;
+struct              GMimeStream;
+void                g_mime_stream_construct             (GMimeStream *stream,
+                                                         gint64 start,
+                                                         gint64 end);
+ssize_t             g_mime_stream_read                  (GMimeStream *stream,
+                                                         char *buf,
+                                                         size_t len);
+ssize_t             g_mime_stream_write                 (GMimeStream *stream,
+                                                         const char *buf,
+                                                         size_t len);
+int                 g_mime_stream_flush                 (GMimeStream *stream);
+gint64              g_mime_stream_seek                  (GMimeStream *stream,
+                                                         gint64 offset,
+                                                         GMimeSeekWhence whence);
+gint64              g_mime_stream_tell                  (GMimeStream *stream);
+int                 g_mime_stream_reset                 (GMimeStream *stream);
+gboolean            g_mime_stream_eos                   (GMimeStream *stream);
+int                 g_mime_stream_close                 (GMimeStream *stream);
+gint64              g_mime_stream_length                (GMimeStream *stream);
+GMimeStream *       g_mime_stream_substream             (GMimeStream *stream,
+                                                         gint64 start,
+                                                         gint64 end);
+void                g_mime_stream_set_bounds            (GMimeStream *stream,
+                                                         gint64 start,
+                                                         gint64 end);
+ssize_t             g_mime_stream_write_string          (GMimeStream *stream,
+                                                         const char *str);
+ssize_t             g_mime_stream_printf                (GMimeStream *stream,
+                                                         const char *fmt,
+                                                         ...);
+ssize_t             g_mime_stream_write_to_stream       (GMimeStream *src,
+                                                         GMimeStream *dest);
+ssize_t             g_mime_stream_writev                (GMimeStream *stream,
+                                                         GMimeStreamIOVector *vector,
+                                                         size_t count);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeStream
+         +----GMimeStreamBuffer
+         +----GMimeStreamCat
+         +----GMimeStreamFile
+         +----GMimeStreamFilter
+         +----GMimeStreamFs
+         +----GMimeStreamMem
+         +----GMimeStreamMmap
+         +----GMimeStreamNull
+         +----GMimeStreamPipe
+
+
+
+

Description

+

+Streams are the fundamental method for reading and writing data +used by GMime. You'll probably notice that the basic API is similar +to that of the low-level Unix I/O layer (read(), write(), lseek(), +etc) with some additional nicities such as a printf-like function. +

+
+
+

Details

+
+

enum GMimeSeekWhence

+
typedef enum {
+	GMIME_STREAM_SEEK_SET = SEEK_SET,
+	GMIME_STREAM_SEEK_CUR = SEEK_CUR,
+	GMIME_STREAM_SEEK_END = SEEK_END
+} GMimeSeekWhence;
+
+

+Relative seek position. +

+
++ + + + + + + + + + + + + + +

GMIME_STREAM_SEEK_SET

Seek relative to the beginning of the stream. +

GMIME_STREAM_SEEK_CUR

Seek relative to the current position in the stream. +

GMIME_STREAM_SEEK_END

Seek relative to the end of the stream. +
+
+
+
+

GMimeStreamIOVector

+
typedef struct {
+	void *data;
+	size_t len;
+} GMimeStreamIOVector;
+
+

+An I/O vector for use with g_mime_stream_writev(). +

+
++ + + + + + + + + + +

void *data;

data to pass to the I/O function.

size_t len;

length of the data, in bytes.
+
+
+
+

struct GMimeStream

+
struct GMimeStream;
+

+Abstract I/O stream class. +

+
++ +
+
+
+
+

g_mime_stream_construct ()

+
void                g_mime_stream_construct             (GMimeStream *stream,
+                                                         gint64 start,
+                                                         gint64 end);
+

+Initializes a new stream with bounds start and end. +

+
++ + + + + + + + + + + + + + +

stream :

a GMimeStream +

start :

start boundary

end :

end boundary
+
+
+
+

g_mime_stream_read ()

+
ssize_t             g_mime_stream_read                  (GMimeStream *stream,
+                                                         char *buf,
+                                                         size_t len);
+

+Attempts to read up to len bytes from stream into buf. +

+
++ + + + + + + + + + + + + + + + + + +

stream :

a GMimeStream +

buf :

buffer

len :

buffer length

Returns :

the number of bytes read or -1 on fail.
+
+
+
+

g_mime_stream_write ()

+
ssize_t             g_mime_stream_write                 (GMimeStream *stream,
+                                                         const char *buf,
+                                                         size_t len);
+

+Attempts to write up to len bytes of buf to stream. +

+
++ + + + + + + + + + + + + + + + + + +

stream :

a GMimeStream +

buf :

buffer

len :

buffer length

Returns :

the number of bytes written or -1 on fail.
+
+
+
+

g_mime_stream_flush ()

+
int                 g_mime_stream_flush                 (GMimeStream *stream);
+

+Sync's the stream to disk. +

+
++ + + + + + + + + + +

stream :

a GMimeStream +

Returns :

+0 on success or -1 on fail.
+
+
+
+

g_mime_stream_seek ()

+
gint64              g_mime_stream_seek                  (GMimeStream *stream,
+                                                         gint64 offset,
+                                                         GMimeSeekWhence whence);
+

+Repositions the offset of the stream stream to +the argument offset according to the +directive whence as follows: +

+

+ GMIME_STREAM_SEEK_SET: Seek offset bytes relative to + the beginning (bound_start) of the stream. +

+

+ GMIME_STREAM_SEEK_CUR: Seek offset bytes relative to the + current offset of the stream. +

+

+ GMIME_STREAM_SEEK_END: Seek offset bytes relative to the + end of the stream (bound_end if non-negative). +

+
++ + + + + + + + + + + + + + + + + + +

stream :

a GMimeStream +

offset :

positional offset

whence :

seek directive

Returns :

the resultant position on success or -1 on fail.
+
+
+
+

g_mime_stream_tell ()

+
gint64              g_mime_stream_tell                  (GMimeStream *stream);
+

+Gets the current offset within the stream. +

+
++ + + + + + + + + + +

stream :

a GMimeStream +

Returns :

the current position within the stream or -1 on fail.
+
+
+
+

g_mime_stream_reset ()

+
int                 g_mime_stream_reset                 (GMimeStream *stream);
+

+Resets the stream. +

+
++ + + + + + + + + + +

stream :

a GMimeStream +

Returns :

+0 on success or -1 on fail.
+
+
+
+

g_mime_stream_eos ()

+
gboolean            g_mime_stream_eos                   (GMimeStream *stream);
+

+Tests the end-of-stream indicator for stream. +

+
++ + + + + + + + + + +

stream :

a GMimeStream +

Returns :

+TRUE on EOS or FALSE otherwise.
+
+
+
+

g_mime_stream_close ()

+
int                 g_mime_stream_close                 (GMimeStream *stream);
+

+Closes the stream. +

+
++ + + + + + + + + + +

stream :

a GMimeStream +

Returns :

+0 on success or -1 on fail.
+
+
+
+

g_mime_stream_length ()

+
gint64              g_mime_stream_length                (GMimeStream *stream);
+

+Gets the length of the stream. +

+
++ + + + + + + + + + +

stream :

a GMimeStream +

Returns :

the length of the stream or -1 if unknown.
+
+
+
+

g_mime_stream_substream ()

+
GMimeStream *       g_mime_stream_substream             (GMimeStream *stream,
+                                                         gint64 start,
+                                                         gint64 end);
+

+Creates a new substream of stream with bounds start and end. +

+
++ + + + + + + + + + + + + + + + + + +

stream :

a GMimeStream +

start :

start boundary

end :

end boundary

Returns :

a substream of stream with bounds start and end.
+
+
+
+

g_mime_stream_set_bounds ()

+
void                g_mime_stream_set_bounds            (GMimeStream *stream,
+                                                         gint64 start,
+                                                         gint64 end);
+

+Set the bounds on a stream. +

+
++ + + + + + + + + + + + + + +

stream :

a GMimeStream +

start :

start boundary

end :

end boundary
+
+
+
+

g_mime_stream_write_string ()

+
ssize_t             g_mime_stream_write_string          (GMimeStream *stream,
+                                                         const char *str);
+

+Writes string to stream. +

+
++ + + + + + + + + + + + + + +

stream :

a GMimeStream +

str :

string to write

Returns :

the number of bytes written or -1 on fail.
+
+
+
+

g_mime_stream_printf ()

+
ssize_t             g_mime_stream_printf                (GMimeStream *stream,
+                                                         const char *fmt,
+                                                         ...);
+

+Write formatted output to a stream. +

+
++ + + + + + + + + + + + + + +

stream :

a GMimeStream +

fmt :

format

Returns :

the number of bytes written or -1 on fail.
+
+
+
+

g_mime_stream_write_to_stream ()

+
ssize_t             g_mime_stream_write_to_stream       (GMimeStream *src,
+                                                         GMimeStream *dest);
+

+Attempts to write the source stream to the destination stream. +

+
++ + + + + + + + + + + + + + +

src :

source stream

dest :

destination stream

Returns :

the number of bytes written or -1 on fail.
+
+
+
+

g_mime_stream_writev ()

+
ssize_t             g_mime_stream_writev                (GMimeStream *stream,
+                                                         GMimeStreamIOVector *vector,
+                                                         size_t count);
+

+Writes at most count blocks described by vector to stream. +

+
++ + + + + + + + + + + + + + + + + + +

stream :

a GMimeStream +

vector :

a GMimeStreamIOVector +

count :

number of vector elements

Returns :

the number of bytes written or -1 on fail.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeStreamBuffer.html b/docs/reference/html/GMimeStreamBuffer.html new file mode 100644 index 0000000..1552a94 --- /dev/null +++ b/docs/reference/html/GMimeStreamBuffer.html @@ -0,0 +1,214 @@ + + + + +GMimeStreamBuffer + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamBuffer

+

GMimeStreamBuffer — A buffered stream

+
+
+

Synopsis

+
enum                GMimeStreamBufferMode;
+struct              GMimeStreamBuffer;
+GMimeStream *       g_mime_stream_buffer_new            (GMimeStream *source,
+                                                         GMimeStreamBufferMode mode);
+ssize_t             g_mime_stream_buffer_gets           (GMimeStream *stream,
+                                                         char *buf,
+                                                         size_t max);
+void                g_mime_stream_buffer_readln         (GMimeStream *stream,
+                                                         GByteArray *buffer);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeStream
+         +----GMimeStreamBuffer
+
+
+
+

Description

+

+A GMimeStreamBuffer can be used on top of any other type of stream +and has 3 modes: block reads, block writes, and cached reads. Block +reads are especially useful if you will be making a lot of small +reads from a stream that accesses the file system. Block writes are +useful for very much the same reason. The final mode, cached reads, +can become memory intensive but can be very helpful when inheriting +from a stream that does not support seeking (Note: this mode is the +least tested so be careful using it). +

+
+
+

Details

+
+

enum GMimeStreamBufferMode

+
typedef enum {
+	GMIME_STREAM_BUFFER_CACHE_READ,
+	GMIME_STREAM_BUFFER_BLOCK_READ,
+	GMIME_STREAM_BUFFER_BLOCK_WRITE
+} GMimeStreamBufferMode;
+
+

+The buffering mode for a GMimeStreamBuffer stream. +

+
++ + + + + + + + + + + + + + +

GMIME_STREAM_BUFFER_CACHE_READ

Cache all reads. +

GMIME_STREAM_BUFFER_BLOCK_READ

Read in 4k blocks. +

GMIME_STREAM_BUFFER_BLOCK_WRITE

Write in 4k blocks. +
+
+
+
+

struct GMimeStreamBuffer

+
struct GMimeStreamBuffer;
+

+A buffered stream wrapper around any GMimeStream object. +

+
++ +
+
+
+
+

g_mime_stream_buffer_new ()

+
GMimeStream *       g_mime_stream_buffer_new            (GMimeStream *source,
+                                                         GMimeStreamBufferMode mode);
+

+Creates a new GMimeStreamBuffer object. +

+
++ + + + + + + + + + + + + + +

source :

source stream

mode :

buffering mode

Returns :

a new buffer stream with source source and mode mode.
+
+
+
+

g_mime_stream_buffer_gets ()

+
ssize_t             g_mime_stream_buffer_gets           (GMimeStream *stream,
+                                                         char *buf,
+                                                         size_t max);
+

+Reads in at most one less than max characters from stream and +stores them into the buffer pointed to by buf. Reading stops after +an EOS or newline ('\n'). If a newline is read, it is stored into +the buffer. A '\0' is stored after the last character in the +buffer. +

+
++ + + + + + + + + + + + + + + + + + +

stream :

stream

buf :

line buffer

max :

max length of a line

Returns :

the number of characters read into buf on success or -1 +on fail.
+
+
+
+

g_mime_stream_buffer_readln ()

+
void                g_mime_stream_buffer_readln         (GMimeStream *stream,
+                                                         GByteArray *buffer);
+

+Reads a single line into buffer. +

+
++ + + + + + + + + + +

stream :

stream

buffer :

output buffer
+
+
+
+

See Also

+GMimeStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeStreamCat.html b/docs/reference/html/GMimeStreamCat.html new file mode 100644 index 0000000..d383521 --- /dev/null +++ b/docs/reference/html/GMimeStreamCat.html @@ -0,0 +1,128 @@ + + + + +GMimeStreamCat + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamCat

+

GMimeStreamCat — A concatenated stream

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeStream
+         +----GMimeStreamCat
+
+
+
+

Description

+

+A GMimeStream which chains together any number of other streams. +

+
+
+

Details

+
+

struct GMimeStreamCat

+
struct GMimeStreamCat;
+

+A concatenation of other GMimeStream objects. +

+
++ +
+
+
+
+

g_mime_stream_cat_new ()

+
GMimeStream *       g_mime_stream_cat_new               (void);
+

+Creates a new GMimeStreamCat object. +

+
++ + + + +

Returns :

a new GMimeStreamCat stream.
+
+
+
+

g_mime_stream_cat_add_source ()

+
int                 g_mime_stream_cat_add_source        (GMimeStreamCat *cat,
+                                                         GMimeStream *source);
+

+Adds the source stream to the cat. +

+
++ + + + + + + + + + + + + + +

cat :

a GMimeStreamCat +

source :

a source stream

Returns :

+0 on success or -1 on fail.
+
+
+
+

See Also

+GMimeStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeStreamFile.html b/docs/reference/html/GMimeStreamFile.html new file mode 100644 index 0000000..2e2ee47 --- /dev/null +++ b/docs/reference/html/GMimeStreamFile.html @@ -0,0 +1,206 @@ + + + + +GMimeStreamFile + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamFile

+

GMimeStreamFile — A Standard-C FILE-based stream

+
+
+

Synopsis

+
struct              GMimeStreamFile;
+GMimeStream *       g_mime_stream_file_new              (FILE *fp);
+GMimeStream *       g_mime_stream_file_new_with_bounds  (FILE *fp,
+                                                         gint64 start,
+                                                         gint64 end);
+gboolean            g_mime_stream_file_get_owner        (GMimeStreamFile *stream);
+void                g_mime_stream_file_set_owner        (GMimeStreamFile *stream,
+                                                         gboolean owner);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeStream
+         +----GMimeStreamFile
+
+
+
+

Description

+

+A simple GMimeStream implementation that sits on top of the +Standard C FILE pointer based I/O layer. Unlike GMimeStreamFs, a +GMimeStreamFile will typically buffer read and write operations at +the FILE level and so it may be wasteful to wrap one in a +GMimeStreamBuffer stream. +

+
+
+

Details

+
+

struct GMimeStreamFile

+
struct GMimeStreamFile;
+

+A GMimeStream wrapper around standard-c FILE pointers. +

+
++ +
+
+
+
+

g_mime_stream_file_new ()

+
GMimeStream *       g_mime_stream_file_new              (FILE *fp);
+

+Creates a new GMimeStreamFile object around fp. +

+

+Note: The created GMimeStreamFile object will own the FILE pointer +passed in. +

+
++ + + + + + + + + + +

fp :

a FILE pointer

Returns :

a stream using fp.
+
+
+
+

g_mime_stream_file_new_with_bounds ()

+
GMimeStream *       g_mime_stream_file_new_with_bounds  (FILE *fp,
+                                                         gint64 start,
+                                                         gint64 end);
+

+Creates a new GMimeStreamFile object around fp with bounds start +and end. +

+

+Note: The created GMimeStreamFile object will own the FILE pointer +passed in. +

+
++ + + + + + + + + + + + + + + + + + +

fp :

a FILE pointer

start :

start boundary

end :

end boundary

Returns :

a stream using fp with bounds start and end.
+
+
+
+

g_mime_stream_file_get_owner ()

+
gboolean            g_mime_stream_file_get_owner        (GMimeStreamFile *stream);
+

+Gets whether or not stream owns the backend FILE pointer. +

+
++ + + + + + + + + + +

stream :

a GMimeStreamFile +

Returns :

+TRUE if stream owns the backend FILE pointer or FALSE +otherwise.
+
+
+
+

g_mime_stream_file_set_owner ()

+
void                g_mime_stream_file_set_owner        (GMimeStreamFile *stream,
+                                                         gboolean owner);
+

+Sets whether or not stream owns the backend FILE pointer. +

+

+Note: owner should be TRUE if the stream should fclose() the +backend FILE pointer when destroyed or FALSE otherwise. +

+
++ + + + + + + + + + +

stream :

a GMimeStreamFile +

owner :

+TRUE if this stream should own the FILE pointer or FALSE otherwise
+
+
+
+

See Also

+GMimeStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeStreamFilter.html b/docs/reference/html/GMimeStreamFilter.html new file mode 100644 index 0000000..3300ccd --- /dev/null +++ b/docs/reference/html/GMimeStreamFilter.html @@ -0,0 +1,170 @@ + + + + +GMimeStreamFilter + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamFilter

+

GMimeStreamFilter — A filtering stream

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----GMimeStream
+         +----GMimeStreamFilter
+
+
+
+

Description

+

+A GMimeStream meant for filtering data passing through it. +

+

+This stream class is useful for converting data of one type to +another using GMimeFilter objects. +

+

+When data passes through a GMimeStreamFilter, it will pass through +GMimeFilter filters in the order they were added. +

+
+
+

Details

+
+

struct GMimeStreamFilter

+
struct GMimeStreamFilter;
+

+A GMimeStream which passes data through any GMimeFilter objects. +

+
++ +
+
+
+
+

g_mime_stream_filter_new ()

+
GMimeStream *       g_mime_stream_filter_new            (GMimeStream *stream);
+

+Creates a new GMimeStreamFilter object using stream as the source +stream. +

+
++ + + + + + + + + + +

stream :

source stream

Returns :

a new filter stream with stream as its source.
+
+
+
+

g_mime_stream_filter_add ()

+
int                 g_mime_stream_filter_add            (GMimeStreamFilter *stream,
+                                                         GMimeFilter *filter);
+

+Adds filter to stream. Filters are applied in the same order in +which they are added. +

+
++ + + + + + + + + + + + + + +

stream :

a GMimeStreamFilter +

filter :

a GMimeFilter +

Returns :

an id for the filter.
+
+
+
+

g_mime_stream_filter_remove ()

+
void                g_mime_stream_filter_remove         (GMimeStreamFilter *stream,
+                                                         int id);
+

+Removed a filter from the stream based on the id (as returned from +filter_add). +

+
++ + + + + + + + + + +

stream :

a GMimeStreamFilter +

id :

filter id
+
+
+
+

See Also

+Filters +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeStreamFs.html b/docs/reference/html/GMimeStreamFs.html new file mode 100644 index 0000000..c2d88ca --- /dev/null +++ b/docs/reference/html/GMimeStreamFs.html @@ -0,0 +1,195 @@ + + + + +GMimeStreamFs + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamFs

+

GMimeStreamFs — A low-level FileSystem stream

+
+
+

Synopsis

+
struct              GMimeStreamFs;
+GMimeStream *       g_mime_stream_fs_new                (int fd);
+GMimeStream *       g_mime_stream_fs_new_with_bounds    (int fd,
+                                                         gint64 start,
+                                                         gint64 end);
+gboolean            g_mime_stream_fs_get_owner          (GMimeStreamFs *stream);
+void                g_mime_stream_fs_set_owner          (GMimeStreamFs *stream,
+                                                         gboolean owner);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeStream
+         +----GMimeStreamFs
+
+
+
+

Description

+

+A simple GMimeStream implementation that sits on top of the +low-level UNIX file descriptor based I/O layer. +

+
+
+

Details

+
+

struct GMimeStreamFs

+
struct GMimeStreamFs;
+

+A GMimeStream wrapper around POSIX file descriptors. +

+
++ +
+
+
+
+

g_mime_stream_fs_new ()

+
GMimeStream *       g_mime_stream_fs_new                (int fd);
+

+Creates a new GMimeStreamFs object around fd. +

+
++ + + + + + + + + + +

fd :

a file descriptor

Returns :

a stream using fd.
+
+
+
+

g_mime_stream_fs_new_with_bounds ()

+
GMimeStream *       g_mime_stream_fs_new_with_bounds    (int fd,
+                                                         gint64 start,
+                                                         gint64 end);
+

+Creates a new GMimeStreamFs object around fd with bounds start +and end. +

+
++ + + + + + + + + + + + + + + + + + +

fd :

a file descriptor

start :

start boundary

end :

end boundary

Returns :

a stream using fd with bounds start and end.
+
+
+
+

g_mime_stream_fs_get_owner ()

+
gboolean            g_mime_stream_fs_get_owner          (GMimeStreamFs *stream);
+

+Gets whether or not stream owns the backend file descriptor. +

+
++ + + + + + + + + + +

stream :

a GMimeStreamFs +

Returns :

+TRUE if stream owns the backend file descriptor or FALSE +otherwise.
+
+
+
+

g_mime_stream_fs_set_owner ()

+
void                g_mime_stream_fs_set_owner          (GMimeStreamFs *stream,
+                                                         gboolean owner);
+

+Sets whether or not stream owns the backend file descriptor. +

+

+Note: owner should be TRUE if the stream should close() the +backend file descriptor when destroyed or FALSE otherwise. +

+
++ + + + + + + + + + +

stream :

a GMimeStreamFs +

owner :

+TRUE if this stream should own the file descriptor or FALSE otherwise
+
+
+
+

See Also

+GMimeStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeStreamMem.html b/docs/reference/html/GMimeStreamMem.html new file mode 100644 index 0000000..6ffd166 --- /dev/null +++ b/docs/reference/html/GMimeStreamMem.html @@ -0,0 +1,259 @@ + + + + +GMimeStreamMem + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamMem

+

GMimeStreamMem — A memory-backed stream

+
+
+

Synopsis

+
struct              GMimeStreamMem;
+GMimeStream *       g_mime_stream_mem_new               (void);
+GMimeStream *       g_mime_stream_mem_new_with_byte_array
+                                                        (GByteArray *array);
+GMimeStream *       g_mime_stream_mem_new_with_buffer   (const char *buffer,
+                                                         size_t len);
+GByteArray *        g_mime_stream_mem_get_byte_array    (GMimeStreamMem *mem);
+void                g_mime_stream_mem_set_byte_array    (GMimeStreamMem *mem,
+                                                         GByteArray *array);
+gboolean            g_mime_stream_mem_get_owner         (GMimeStreamMem *mem);
+void                g_mime_stream_mem_set_owner         (GMimeStreamMem *mem,
+                                                         gboolean owner);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeStream
+         +----GMimeStreamMem
+
+
+
+

Description

+

+A simple GMimeStream implementation that uses a memory buffer for +storage. +

+
+
+

Details

+
+

struct GMimeStreamMem

+
struct GMimeStreamMem;
+

+A memory-backed GMimeStream. +

+
++ +
+
+
+
+

g_mime_stream_mem_new ()

+
GMimeStream *       g_mime_stream_mem_new               (void);
+

+Creates a new GMimeStreamMem object. +

+
++ + + + +

Returns :

a new memory stream.
+
+
+
+

g_mime_stream_mem_new_with_byte_array ()

+
GMimeStream *       g_mime_stream_mem_new_with_byte_array
+                                                        (GByteArray *array);
+

+Creates a new GMimeStreamMem with data array. +

+
++ + + + + + + + + + +

array :

source data

Returns :

a new memory stream using array.
+
+
+
+

g_mime_stream_mem_new_with_buffer ()

+
GMimeStream *       g_mime_stream_mem_new_with_buffer   (const char *buffer,
+                                                         size_t len);
+

+Creates a new GMimeStreamMem object and initializes the stream +contents with the first len bytes of buffer. +

+
++ + + + + + + + + + + + + + +

buffer :

stream data

len :

buffer length

Returns :

a new memory stream initialized with buffer.
+
+
+
+

g_mime_stream_mem_get_byte_array ()

+
GByteArray *        g_mime_stream_mem_get_byte_array    (GMimeStreamMem *mem);
+

+Gets the byte array from the memory stream. +

+
++ + + + + + + + + + +

mem :

a GMimeStreamMem +

Returns :

the byte array from the memory stream.
+
+
+
+

g_mime_stream_mem_set_byte_array ()

+
void                g_mime_stream_mem_set_byte_array    (GMimeStreamMem *mem,
+                                                         GByteArray *array);
+

+Sets the byte array on the memory stream. +

+

+Note: The memory stream is not responsible for freeing the byte +array. Use g_mime_stream_mem_set_owner() to change this behavior. +

+
++ + + + + + + + + + +

mem :

a GMimeStreamMem +

array :

stream data
+
+
+
+

g_mime_stream_mem_get_owner ()

+
gboolean            g_mime_stream_mem_get_owner         (GMimeStreamMem *mem);
+

+Gets whether or not mem owns the backend memory buffer. +

+
++ + + + + + + + + + +

mem :

a GMimeStreamMem +

Returns :

+TRUE if mem owns the backend memory buffer or FALSE +otherwise.
+
+
+
+

g_mime_stream_mem_set_owner ()

+
void                g_mime_stream_mem_set_owner         (GMimeStreamMem *mem,
+                                                         gboolean owner);
+

+Sets whether or not mem owns the backend memory buffer. +

+

+Note: owner should be TRUE if the stream should free the backend +memory buffer when destroyed or FALSE otherwise. +

+
++ + + + + + + + + + +

mem :

a GMimeStreamMem +

owner :

+TRUE if this stream should own the GByteArray or FALSE otherwise
+
+
+
+

See Also

+GMimeStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeStreamMmap.html b/docs/reference/html/GMimeStreamMmap.html new file mode 100644 index 0000000..881a700 --- /dev/null +++ b/docs/reference/html/GMimeStreamMmap.html @@ -0,0 +1,166 @@ + + + + +GMimeStreamMmap + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamMmap

+

GMimeStreamMmap — A memory-mapped file stream

+
+
+

Synopsis

+
struct              GMimeStreamMmap;
+GMimeStream *       g_mime_stream_mmap_new              (int fd,
+                                                         int prot,
+                                                         int flags);
+GMimeStream *       g_mime_stream_mmap_new_with_bounds  (int fd,
+                                                         int prot,
+                                                         int flags,
+                                                         gint64 start,
+                                                         gint64 end);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeStream
+         +----GMimeStreamMmap
+
+
+
+

Description

+

+A GMimeStream implementation using a memory-mapped file backing +store. This may be faster than GMimeStreamFs or GMimeStreamFile +but you'll have to do your own performance checking to be sure for +your particular application/platform. +

+
+
+

Details

+
+

struct GMimeStreamMmap

+
struct GMimeStreamMmap;
+

+A memory-mapped GMimeStream. +

+
++ +
+
+
+
+

g_mime_stream_mmap_new ()

+
GMimeStream *       g_mime_stream_mmap_new              (int fd,
+                                                         int prot,
+                                                         int flags);
+

+Creates a new GMimeStreamMmap object around fd. +

+
++ + + + + + + + + + + + + + + + + + +

fd :

file descriptor

prot :

protection flags

flags :

map flags

Returns :

a stream using fd.
+
+
+
+

g_mime_stream_mmap_new_with_bounds ()

+
GMimeStream *       g_mime_stream_mmap_new_with_bounds  (int fd,
+                                                         int prot,
+                                                         int flags,
+                                                         gint64 start,
+                                                         gint64 end);
+

+Creates a new GMimeStreamMmap object around fd with bounds start +and end. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

fd :

file descriptor

prot :

protection flags

flags :

map flags

start :

start boundary

end :

end boundary

Returns :

a stream using fd with bounds start and end.
+
+
+
+

See Also

+GMimeStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeStreamNull.html b/docs/reference/html/GMimeStreamNull.html new file mode 100644 index 0000000..16acfeb --- /dev/null +++ b/docs/reference/html/GMimeStreamNull.html @@ -0,0 +1,102 @@ + + + + +GMimeStreamNull + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamNull

+

GMimeStreamNull — A null stream

+
+
+

Synopsis

+
struct              GMimeStreamNull;
+GMimeStream *       g_mime_stream_null_new              (void);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeStream
+         +----GMimeStreamNull
+
+
+
+

Description

+

+A GMimeStream which has no real backing storage at all. This +stream is useful for dry-runs and can also be useful for +determining statistics on source data which can be written to +streams but cannot be read as a stream itself (e.g. a GMimeObject +via g_mime_object_write_to_stream()). +

+
+
+

Details

+
+

struct GMimeStreamNull

+
struct GMimeStreamNull;
+

+A GMimeStream which has no backing store. +

+
++ +
+
+
+
+

g_mime_stream_null_new ()

+
GMimeStream *       g_mime_stream_null_new              (void);
+

+Creates a new GMimeStreamNull object. +

+
++ + + + +

Returns :

a new null stream (similar to /dev/null on Unix).
+
+
+
+

See Also

+GMimeStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/GMimeStreamPipe.html b/docs/reference/html/GMimeStreamPipe.html new file mode 100644 index 0000000..10377c0 --- /dev/null +++ b/docs/reference/html/GMimeStreamPipe.html @@ -0,0 +1,159 @@ + + + + +GMimeStreamPipe + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeStreamPipe

+

GMimeStreamPipe — A low-level pipe stream

+
+
+

Synopsis

+
struct              GMimeStreamPipe;
+GMimeStream *       g_mime_stream_pipe_new              (int fd);
+gboolean            g_mime_stream_pipe_get_owner        (GMimeStreamPipe *stream);
+void                g_mime_stream_pipe_set_owner        (GMimeStreamPipe *stream,
+                                                         gboolean owner);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----GMimeStream
+         +----GMimeStreamPipe
+
+
+
+

Description

+

+A simple GMimeStream implementation that sits on top of low-level +POSIX pipes. +

+
+
+

Details

+
+

struct GMimeStreamPipe

+
struct GMimeStreamPipe;
+

+A GMimeStream wrapper around pipes. +

+
++ +
+
+
+
+

g_mime_stream_pipe_new ()

+
GMimeStream *       g_mime_stream_pipe_new              (int fd);
+

+Creates a new GMimeStreamPipe object around fd. +

+
++ + + + + + + + + + +

fd :

a pipe descriptor

Returns :

a stream using fd.
+
+
+
+

g_mime_stream_pipe_get_owner ()

+
gboolean            g_mime_stream_pipe_get_owner        (GMimeStreamPipe *stream);
+

+Gets whether or not stream owns the backend pipe descriptor. +

+
++ + + + + + + + + + +

stream :

a GMimeStreamPipe +

Returns :

+TRUE if stream owns the backend pipe descriptor or FALSE +otherwise.
+
+
+
+

g_mime_stream_pipe_set_owner ()

+
void                g_mime_stream_pipe_set_owner        (GMimeStreamPipe *stream,
+                                                         gboolean owner);
+

+Sets whether or not stream owns the backend pipe descriptor. +

+

+Note: owner should be TRUE if the stream should close() the +backend pipe descriptor when destroyed or FALSE otherwise. +

+
++ + + + + + + + + + +

stream :

a GMimeStreamPipe +

owner :

owner
+
+
+
+

See Also

+GMimeStream +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/Headers.html b/docs/reference/html/Headers.html new file mode 100644 index 0000000..e438844 --- /dev/null +++ b/docs/reference/html/Headers.html @@ -0,0 +1,44 @@ + + + + +Message and MIME Headers + + + + + + + + + + + + + + + + +
+

+Message and MIME Headers

+
+
+GMimeHeader — Message and MIME part headers +
+
+GMimeContentType — Content-Type fields +
+
+GMimeContentDisposition — Content-Disposition fields +
+
+GMimeParam — Content-Type and Content-Disposition parameters +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/InternetAddress.html b/docs/reference/html/InternetAddress.html new file mode 100644 index 0000000..4166549 --- /dev/null +++ b/docs/reference/html/InternetAddress.html @@ -0,0 +1,163 @@ + + + + +InternetAddress + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

InternetAddress

+

InternetAddress — Internet addresses

+
+
+

Synopsis

+
struct              InternetAddress;
+const char *        internet_address_get_name           (InternetAddress *ia);
+void                internet_address_set_name           (InternetAddress *ia,
+                                                         const char *name);
+char *              internet_address_to_string          (InternetAddress *ia,
+                                                         gboolean encode);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----InternetAddress
+         +----InternetAddressGroup
+         +----InternetAddressMailbox
+
+
+
+

Description

+

+An InternetAddress is the base class for InternetAddressGroup and +InternetAddressMailbox. +

+
+
+

Details

+
+

struct InternetAddress

+
struct InternetAddress;
+

+An RFC 2822 Address object. +

+
++ +
+
+
+
+

internet_address_get_name ()

+
const char *        internet_address_get_name           (InternetAddress *ia);
+

+Gets the display name of the InternetAddress. +

+
++ + + + + + + + + + +

ia :

a InternetAddress +

Returns :

the display name of ia.
+
+
+
+

internet_address_set_name ()

+
void                internet_address_set_name           (InternetAddress *ia,
+                                                         const char *name);
+

+Set the display name of the InternetAddress. +

+
++ + + + + + + + + + +

ia :

a InternetAddress +

name :

the display name for the address group or mailbox
+
+
+
+

internet_address_to_string ()

+
char *              internet_address_to_string          (InternetAddress *ia,
+                                                         gboolean encode);
+

+Allocates a string containing the contents of the InternetAddress +object. +

+
++ + + + + + + + + + + + + + +

ia :

Internet Address object

encode :

+TRUE if the address should be rfc2047 encoded

Returns :

the InternetAddress object as an allocated string in +rfc822 format.
+
+
+ +
+ + + \ No newline at end of file diff --git a/docs/reference/html/InternetAddressGroup.html b/docs/reference/html/InternetAddressGroup.html new file mode 100644 index 0000000..e18cea5 --- /dev/null +++ b/docs/reference/html/InternetAddressGroup.html @@ -0,0 +1,187 @@ + + + + +InternetAddressGroup + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

InternetAddressGroup

+

InternetAddressGroup — rfc822 'group' address

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----InternetAddress
+         +----InternetAddressGroup
+
+
+
+

Description

+

+An InternetAddressGroup represents an rfc822 'group' address. +

+
+
+

Details

+
+

struct InternetAddressGroup

+
struct InternetAddressGroup;
+

+An RFC 2822 Group address. +

+
++ +
+
+
+
+

internet_address_group_new ()

+
InternetAddress *   internet_address_group_new          (const char *name);
+

+Creates a new InternetAddressGroup object with a display name of +name. +

+
++ + + + + + + + + + +

name :

group name

Returns :

a new InternetAddressGroup object.
+
+
+
+

internet_address_group_get_members ()

+
InternetAddressList * internet_address_group_get_members
+                                                        (InternetAddressGroup *group);
+

+Gets the InternetAddressList containing the group members of an +rfc822 group address. +

+
++ + + + + + + + + + +

group :

a InternetAddressGroup +

Returns :

a InternetAddressList containing the members of group.
+
+
+
+

internet_address_group_set_members ()

+
void                internet_address_group_set_members  (InternetAddressGroup *group,
+                                                         InternetAddressList *members);
+

+Set the members of the internet address group. +

+
++ + + + + + + + + + +

group :

a InternetAddressGroup +

members :

a InternetAddressList +
+
+
+
+

internet_address_group_add_member ()

+
int                 internet_address_group_add_member   (InternetAddressGroup *group,
+                                                         InternetAddress *member);
+

+Add a contact to the internet address group. +

+
++ + + + + + + + + + + + + + +

group :

a InternetAddressGroup +

member :

a InternetAddress +

Returns :

the index of the newly added member.
+
+
+
+

See Also

+InternetAddress +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/InternetAddressList.html b/docs/reference/html/InternetAddressList.html new file mode 100644 index 0000000..442f7b7 --- /dev/null +++ b/docs/reference/html/InternetAddressList.html @@ -0,0 +1,526 @@ + + + + +InternetAddressList + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

InternetAddressList

+

InternetAddressList — A list of internet addresses

+
+ +
+

Object Hierarchy

+
+  GObject
+   +----InternetAddressList
+
+
+
+

Description

+

+An InternetAddressList is a collection of InternetAddress +objects. +

+
+
+

Details

+
+

struct InternetAddressList

+
struct InternetAddressList;
+

+A collection of InternetAddress objects. +

+
++ +
+
+
+
+

internet_address_list_new ()

+
InternetAddressList * internet_address_list_new         (void);
+

+Creates a new InternetAddressList. +

+
++ + + + +

Returns :

a new InternetAddressList.
+
+
+
+

internet_address_list_length ()

+
int                 internet_address_list_length        (InternetAddressList *list);
+

+Gets the length of the list. +

+
++ + + + + + + + + + +

list :

a InternetAddressList +

Returns :

the number of InternetAddress objects in the list.
+
+
+
+

internet_address_list_clear ()

+
void                internet_address_list_clear         (InternetAddressList *list);
+

+Clears the list of addresses. +

+
++ + + + +

list :

a InternetAddressList +
+
+
+
+

internet_address_list_add ()

+
int                 internet_address_list_add           (InternetAddressList *list,
+                                                         InternetAddress *ia);
+

+Adds an InternetAddress to the InternetAddressList. +

+
++ + + + + + + + + + + + + + +

list :

a InternetAddressList +

ia :

a InternetAddress +

Returns :

the index of the added InternetAddress.
+
+
+
+

internet_address_list_insert ()

+
void                internet_address_list_insert        (InternetAddressList *list,
+                                                         int index,
+                                                         InternetAddress *ia);
+

+Inserts an InternetAddress into the InternetAddressList at the +specified index. +

+
++ + + + + + + + + + + + + + +

list :

a InternetAddressList +

index :

index to insert at

ia :

a InternetAddress +
+
+
+
+

internet_address_list_remove ()

+
gboolean            internet_address_list_remove        (InternetAddressList *list,
+                                                         InternetAddress *ia);
+

+Removes an InternetAddress from the InternetAddressList. +

+
++ + + + + + + + + + + + + + +

list :

a InternetAddressList +

ia :

a InternetAddress +

Returns :

+TRUE if the specified InternetAddress was removed or +FALSE otherwise.
+
+
+
+

internet_address_list_remove_at ()

+
gboolean            internet_address_list_remove_at     (InternetAddressList *list,
+                                                         int index);
+

+Removes an InternetAddress from the InternetAddressList at the +specified index. +

+
++ + + + + + + + + + + + + + +

list :

a InternetAddressList +

index :

index to remove

Returns :

+TRUE if an InternetAddress was removed or FALSE +otherwise.
+
+
+
+

internet_address_list_contains ()

+
gboolean            internet_address_list_contains      (InternetAddressList *list,
+                                                         InternetAddress *ia);
+

+Checks whether or not the specified InternetAddress is contained +within the InternetAddressList. +

+
++ + + + + + + + + + + + + + +

list :

a InternetAddressList +

ia :

a InternetAddress +

Returns :

+TRUE if the specified InternetAddress is contained +within the specified InternetAddressList or FALSE otherwise.
+
+
+
+

internet_address_list_index_of ()

+
int                 internet_address_list_index_of      (InternetAddressList *list,
+                                                         InternetAddress *ia);
+

+Gets the index of the specified InternetAddress inside the +InternetAddressList. +

+
++ + + + + + + + + + + + + + +

list :

a InternetAddressList +

ia :

a InternetAddress +

Returns :

the index of the requested InternetAddress within the +InternetAddressList or -1 if it is not contained within the +InternetAddressList.
+
+
+
+

internet_address_list_get_address ()

+
InternetAddress *   internet_address_list_get_address   (InternetAddressList *list,
+                                                         int index);
+

+Gets the InternetAddress at the specified index. +

+
++ + + + + + + + + + + + + + +

list :

a InternetAddressList +

index :

index of InternetAddress to get

Returns :

the InternetAddress at the specified index or NULL if +the index is out of range.
+
+
+
+

internet_address_list_set_address ()

+
void                internet_address_list_set_address   (InternetAddressList *list,
+                                                         int index,
+                                                         InternetAddress *ia);
+

+Sets the InternetAddress at the specified index to ia. +

+
++ + + + + + + + + + + + + + +

list :

a InternetAddressList +

index :

index of InternetAddress to set

ia :

a InternetAddress +
+
+
+
+

internet_address_list_prepend ()

+
void                internet_address_list_prepend       (InternetAddressList *list,
+                                                         InternetAddressList *prepend);
+

+Inserts all of the addresses in prepend to the beginning of list. +

+
++ + + + + + + + + + +

list :

a InternetAddressList +

prepend :

a InternetAddressList +
+
+
+
+

internet_address_list_append ()

+
void                internet_address_list_append        (InternetAddressList *list,
+                                                         InternetAddressList *append);
+

+Adds all of the addresses in append to list. +

+
++ + + + + + + + + + +

list :

a InternetAddressList +

append :

a InternetAddressList +
+
+
+
+

internet_address_list_to_string ()

+
char *              internet_address_list_to_string     (InternetAddressList *list,
+                                                         gboolean encode);
+

+Allocates a string buffer containing the rfc822 formatted addresses +in list. +

+
++ + + + + + + + + + + + + + +

list :

list of internet addresses

encode :

+TRUE if the address should be rfc2047 encoded

Returns :

a string containing the list of addresses in rfc822 format +or NULL if no addresses are contained in the list.
+
+
+
+

internet_address_list_parse_string ()

+
InternetAddressList * internet_address_list_parse_string
+                                                        (const char *str);
+

+Construct a list of internet addresses from the given string. +

+
++ + + + + + + + + + +

str :

a string containing internet addresses

Returns :

a InternetAddressList or NULL if the input string does +not contain any addresses.
+
+
+
+

internet_address_list_writer ()

+
void                internet_address_list_writer        (InternetAddressList *list,
+                                                         GString *str);
+

+Writes the rfc2047-encoded rfc822 formatted addresses in list to +string, folding appropriately. +

+
++ + + + + + + + + + +

list :

list of internet addresses

str :

string to write to
+
+
+
+

See Also

+InternetAddress +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/InternetAddressMailbox.html b/docs/reference/html/InternetAddressMailbox.html new file mode 100644 index 0000000..bce838c --- /dev/null +++ b/docs/reference/html/InternetAddressMailbox.html @@ -0,0 +1,160 @@ + + + + +InternetAddressMailbox + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

InternetAddressMailbox

+

InternetAddressMailbox — rfc822 'mailbox' address

+
+
+

Synopsis

+
struct              InternetAddressMailbox;
+InternetAddress *   internet_address_mailbox_new        (const char *name,
+                                                         const char *addr);
+const char *        internet_address_mailbox_get_addr   (InternetAddressMailbox *mailbox);
+void                internet_address_mailbox_set_addr   (InternetAddressMailbox *mailbox,
+                                                         const char *addr);
+
+
+
+

Object Hierarchy

+
+  GObject
+   +----InternetAddress
+         +----InternetAddressMailbox
+
+
+
+

Description

+

+An InternetAddressMailbox represents what is a typical "email +address". +

+
+
+

Details

+
+

struct InternetAddressMailbox

+
struct InternetAddressMailbox;
+

+An RFC 2822 Mailbox address. +

+
++ +
+
+
+
+

internet_address_mailbox_new ()

+
InternetAddress *   internet_address_mailbox_new        (const char *name,
+                                                         const char *addr);
+

+Creates a new InternetAddress object with name name and address +addr. +

+
++ + + + + + + + + + + + + + +

name :

person's name

addr :

person's address

Returns :

a new InternetAddressMailbox object.
+
+
+
+

internet_address_mailbox_get_addr ()

+
const char *        internet_address_mailbox_get_addr   (InternetAddressMailbox *mailbox);
+

+Gets the addr-spec of the internet address mailbox. +

+
++ + + + + + + + + + +

mailbox :

a InternetAddressMailbox +

Returns :

the address of the mailbox.
+
+
+
+

internet_address_mailbox_set_addr ()

+
void                internet_address_mailbox_set_addr   (InternetAddressMailbox *mailbox,
+                                                         const char *addr);
+

+Set the mailbox address. +

+
++ + + + + + + + + + +

mailbox :

a InternetAddressMailbox +

addr :

contact's email address
+
+
+
+

See Also

+InternetAddress +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/InternetAddresses.html b/docs/reference/html/InternetAddresses.html new file mode 100644 index 0000000..34a8b7a --- /dev/null +++ b/docs/reference/html/InternetAddresses.html @@ -0,0 +1,44 @@ + + + + +Internet Addresses + + + + + + + + + + + + + + + + +
+

+Internet Addresses

+
+
+InternetAddress — Internet addresses +
+
+InternetAddressGroup — rfc822 'group' address +
+
+InternetAddressMailbox — rfc822 'mailbox' address +
+
+InternetAddressList — A list of internet addresses +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/MimeParts.html b/docs/reference/html/MimeParts.html new file mode 100644 index 0000000..b6e7454 --- /dev/null +++ b/docs/reference/html/MimeParts.html @@ -0,0 +1,59 @@ + + + + +MIME Messages and Parts + + + + + + + + + + + + + + + + +
+

+MIME Messages and Parts

+
+
+GMimeObject — Abstract MIME objects +
+
+GMimeMessage — Messages +
+
+GMimePart — MIME parts +
+
+GMimeMultipart — MIME multiparts +
+
+GMimeMultipartEncrypted — Encrypted MIME multiparts +
+
+GMimeMultipartSigned — Signed MIME multiparts +
+
+GMimeMessagePart — Message parts +
+
+GMimeMessagePartial — Partial MIME parts +
+
+GMimePartIter — MIME part iterators +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/Parsers.html b/docs/reference/html/Parsers.html new file mode 100644 index 0000000..662af1f --- /dev/null +++ b/docs/reference/html/Parsers.html @@ -0,0 +1,33 @@ + + + + +Parsing Messages and MIME Parts + + + + + + + + + + + + + + + + +
+

+Parsing Messages and MIME Parts

+
+GMimeParser — Message and MIME part parser +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/Streams.html b/docs/reference/html/Streams.html new file mode 100644 index 0000000..bdb113d --- /dev/null +++ b/docs/reference/html/Streams.html @@ -0,0 +1,62 @@ + + + + +Streams + + + + + + + + + + + + + + + + +
+

+Streams

+
+
+GMimeStream — Abstract stream class +
+
+GMimeStreamFile — A Standard-C FILE-based stream +
+
+GMimeStreamFs — A low-level FileSystem stream +
+
+GMimeStreamMem — A memory-backed stream +
+
+GMimeStreamMmap — A memory-mapped file stream +
+
+GMimeStreamNull — A null stream +
+
+GMimeStreamFilter — A filtering stream +
+
+GMimeStreamBuffer — A buffered stream +
+
+GMimeStreamPipe — A low-level pipe stream +
+
+GMimeStreamCat — A concatenated stream +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/ch01.html b/docs/reference/html/ch01.html new file mode 100644 index 0000000..b21fd60 --- /dev/null +++ b/docs/reference/html/ch01.html @@ -0,0 +1,75 @@ + + + + +Class hierarchy + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/html/classes.html b/docs/reference/html/classes.html new file mode 100644 index 0000000..6a51f85 --- /dev/null +++ b/docs/reference/html/classes.html @@ -0,0 +1,197 @@ + + + + +Part IV. GMime Classes + + + + + + + + + + + + + + + + +
+

+Part IV. GMime Classes

+
+

Table of Contents

+
+
Class hierarchy
+
Streams
+
+
+GMimeStream — Abstract stream class +
+
+GMimeStreamFile — A Standard-C FILE-based stream +
+
+GMimeStreamFs — A low-level FileSystem stream +
+
+GMimeStreamMem — A memory-backed stream +
+
+GMimeStreamMmap — A memory-mapped file stream +
+
+GMimeStreamNull — A null stream +
+
+GMimeStreamFilter — A filtering stream +
+
+GMimeStreamBuffer — A buffered stream +
+
+GMimeStreamPipe — A low-level pipe stream +
+
+GMimeStreamCat — A concatenated stream +
+
+
Stream Filters
+
+
+GMimeFilter — Abstract filter class +
+
+GMimeFilterBasic — Basic transfer encoding filter +
+
+GMimeFilterBest — Determine the best charset/encoding to use for a stream +
+
+GMimeFilterCharset — Charset-conversion filter +
+
+GMimeFilterCRLF — Convert line-endings from LF to CRLF or vise versa +
+
+GMimeFilterEnriched — Convert text/enriched or text/rtf to HTML +
+
+GMimeFilterFrom — Escape MBox From_ lines +
+
+GMimeFilterGZip — GNU Zip compression/decompression +
+
+GMimeFilterHTML — Convert plain text into HTML +
+
+GMimeFilterMd5 — Calculate an md5sum +
+
+GMimeFilterStrip — Strip trailing whitespace from the end of lines +
+
+GMimeFilterWindows — Determine if text is in a Microsoft Windows codepage +
+
+GMimeFilterYenc — yEncode or yDecode +
+
+
Data Wrappers
+
+GMimeDataWrapper — Content objects +
+
Message and MIME Headers
+
+
+GMimeHeader — Message and MIME part headers +
+
+GMimeContentType — Content-Type fields +
+
+GMimeContentDisposition — Content-Disposition fields +
+
+GMimeParam — Content-Type and Content-Disposition parameters +
+
+
Internet Addresses
+
+
+InternetAddress — Internet addresses +
+
+InternetAddressGroup — rfc822 'group' address +
+
+InternetAddressMailbox — rfc822 'mailbox' address +
+
+InternetAddressList — A list of internet addresses +
+
+
MIME Messages and Parts
+
+
+GMimeObject — Abstract MIME objects +
+
+GMimeMessage — Messages +
+
+GMimePart — MIME parts +
+
+GMimeMultipart — MIME multiparts +
+
+GMimeMultipartEncrypted — Encrypted MIME multiparts +
+
+GMimeMultipartSigned — Signed MIME multiparts +
+
+GMimeMessagePart — Message parts +
+
+GMimeMessagePartial — Partial MIME parts +
+
+GMimePartIter — MIME part iterators +
+
+
Parsing Messages and MIME Parts
+
+GMimeParser — Message and MIME part parser +
+
Cryptography Contexts
+
+
+GMimeCertificate — Digital certificates +
+
+GMimeSignature — Digital signatures +
+
+GMimeCryptoContext — Encryption/signing contexts +
+
+GMimeGpgContext — GnuPG crypto contexts +
+
+GMimePkcs7Context — PKCS7 crypto contexts +
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/core.html b/docs/reference/html/core.html new file mode 100644 index 0000000..4797ac0 --- /dev/null +++ b/docs/reference/html/core.html @@ -0,0 +1,53 @@ + + + + +Part III. GMime Core Reference + + + + + + + + + + + + + + + + +
+

+Part III. GMime Core Reference

+
+

Table of Contents

+
+
+gmime — Initialization, shutdown and version-check routines +
+
+gmime-charset — Charset helper functions +
+
+gmime-iconv — Low-level routines for converting text from one charset to another +
+
+gmime-iconv-utils — High-level routines for converting text from one charset to another +
+
+gmime-encodings — MIME encoding functions +
+
+gmime-utils — MIME utility functions +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/fundamentals.html b/docs/reference/html/fundamentals.html new file mode 100644 index 0000000..154609f --- /dev/null +++ b/docs/reference/html/fundamentals.html @@ -0,0 +1,44 @@ + + + + +Part II. GMime Fundamentals + + + + + + + + + + + + + + + + +
+

+Part II. GMime Fundamentals

+
+

Table of Contents

+
+
+GMime Streams — How to use GMime Streams +
+
+GMime Stream Filters — How to use GMime Stream Filters +
+
+GMime Data Wrappers — How to use GMime Data Wrappers +
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-GMimeHeader.html b/docs/reference/html/gmime-GMimeHeader.html new file mode 100644 index 0000000..59d3424 --- /dev/null +++ b/docs/reference/html/gmime-GMimeHeader.html @@ -0,0 +1,956 @@ + + + + +GMimeHeader + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeHeader

+

GMimeHeader — Message and MIME part headers

+
+
+

Synopsis

+
struct              GMimeHeaderIter;
+                    GMimeHeaderList;
+ssize_t             (*GMimeHeaderWriter)                (GMimeStream *stream,
+                                                         const char *name,
+                                                         const char *value);
+void                (*GMimeHeaderForeachFunc)           (const char *name,
+                                                         const char *value,
+                                                         gpointer user_data);
+GMimeHeaderIter *   g_mime_header_iter_new              (void);
+void                g_mime_header_iter_free             (GMimeHeaderIter *iter);
+GMimeHeaderIter *   g_mime_header_iter_copy             (GMimeHeaderIter *iter);
+void                g_mime_header_iter_copy_to          (GMimeHeaderIter *src,
+                                                         GMimeHeaderIter *dest);
+gboolean            g_mime_header_iter_equal            (GMimeHeaderIter *iter1,
+                                                         GMimeHeaderIter *iter2);
+gboolean            g_mime_header_iter_first            (GMimeHeaderIter *iter);
+gboolean            g_mime_header_iter_last             (GMimeHeaderIter *iter);
+gboolean            g_mime_header_iter_next             (GMimeHeaderIter *iter);
+gboolean            g_mime_header_iter_prev             (GMimeHeaderIter *iter);
+gboolean            g_mime_header_iter_is_valid         (GMimeHeaderIter *iter);
+const char *        g_mime_header_iter_get_name         (GMimeHeaderIter *iter);
+const char *        g_mime_header_iter_get_value        (GMimeHeaderIter *iter);
+gboolean            g_mime_header_iter_set_value        (GMimeHeaderIter *iter,
+                                                         const char *value);
+gboolean            g_mime_header_iter_remove           (GMimeHeaderIter *iter);
+GMimeHeaderList *   g_mime_header_list_new              (void);
+void                g_mime_header_list_destroy          (GMimeHeaderList *headers);
+void                g_mime_header_list_clear            (GMimeHeaderList *headers);
+gboolean            g_mime_header_list_contains         (const GMimeHeaderList *headers,
+                                                         const char *name);
+void                g_mime_header_list_prepend          (GMimeHeaderList *headers,
+                                                         const char *name,
+                                                         const char *value);
+void                g_mime_header_list_append           (GMimeHeaderList *headers,
+                                                         const char *name,
+                                                         const char *value);
+gboolean            g_mime_header_list_remove           (GMimeHeaderList *headers,
+                                                         const char *name);
+void                g_mime_header_list_set              (GMimeHeaderList *headers,
+                                                         const char *name,
+                                                         const char *value);
+const char *        g_mime_header_list_get              (const GMimeHeaderList *headers,
+                                                         const char *name);
+gboolean            g_mime_header_list_get_iter         (GMimeHeaderList *headers,
+                                                         GMimeHeaderIter *iter);
+void                g_mime_header_list_foreach          (const GMimeHeaderList *headers,
+                                                         GMimeHeaderForeachFunc func,
+                                                         gpointer user_data);
+void                g_mime_header_list_register_writer  (GMimeHeaderList *headers,
+                                                         const char *name,
+                                                         GMimeHeaderWriter writer);
+ssize_t             g_mime_header_list_write_to_stream  (const GMimeHeaderList *headers,
+                                                         GMimeStream *stream);
+char *              g_mime_header_list_to_string        (const GMimeHeaderList *headers);
+GMimeStream *       g_mime_header_list_get_stream       (GMimeHeaderList *headers);
+void                g_mime_header_list_set_stream       (GMimeHeaderList *headers,
+                                                         GMimeStream *stream);
+
+
+
+

Description

+

+A GMimeHeader is a collection of rfc822 header fields and their +values. +

+
+
+

Details

+
+

struct GMimeHeaderIter

+
struct GMimeHeaderIter {
+	GMimeHeaderList *hdrlist;
+	GMimeHeader *cursor;
+	guint32 version;
+};
+
+

+A message or mime-part header iterator. All members should be +considered private. +

+
++ + + + + + + + + + + + + + +

GMimeHeaderList *hdrlist;

a GMimeHeaderList +

GMimeHeader *cursor;

a GMimeHeader +

guint32 version;

the version of hdrlist when initialized
+
+
+
+

GMimeHeaderList

+
typedef struct _GMimeHeaderList GMimeHeaderList;
+

+A message or mime-part header. +

+
+
+
+

GMimeHeaderWriter ()

+
ssize_t             (*GMimeHeaderWriter)                (GMimeStream *stream,
+                                                         const char *name,
+                                                         const char *value);
+

+Function signature for the callback to +g_mime_header_list_register_writer(). +

+
++ + + + + + + + + + + + + + + + + + +

stream :

The output stream.

name :

The field name.

value :

The field value.

Returns :

the number of bytes written or -1 on error.
+
+
+
+

GMimeHeaderForeachFunc ()

+
void                (*GMimeHeaderForeachFunc)           (const char *name,
+                                                         const char *value,
+                                                         gpointer user_data);
+

+Function signature for the callback to g_mime_header_list_foreach(). +

+
++ + + + + + + + + + + + + + +

name :

The field name.

value :

The field value.

user_data :

The user-supplied callback data.
+
+
+
+

g_mime_header_iter_new ()

+
GMimeHeaderIter *   g_mime_header_iter_new              (void);
+

+Dynamically allocates a GMimeHeaderIter on the heap. This is +intended for use in language bindings but may also be useful in +applications as well. You must free this iter with +g_mime_header_iter_free(). +

+
++ + + + +

Returns :

a newly-allocated GMimeHeaderIter.
+
+
+
+

g_mime_header_iter_free ()

+
void                g_mime_header_iter_free             (GMimeHeaderIter *iter);
+

+Frees a dynamically-allocated GMimeHeaderIter as created by +g_mime_header_iter_new() or g_mime_header_iter_copy(). +

+
++ + + + +

iter :

a GMimeHeaderIter +
+
+
+
+

g_mime_header_iter_copy ()

+
GMimeHeaderIter *   g_mime_header_iter_copy             (GMimeHeaderIter *iter);
+

+Creates a dynamically allocated header iterator as a copy of +iter. You must free this iter with g_mime_header_iter_free(). +

+
++ + + + + + + + + + +

iter :

a GMimeHeaderIter +

Returns :

a newly-allocated copy of iter.
+
+
+
+

g_mime_header_iter_copy_to ()

+
void                g_mime_header_iter_copy_to          (GMimeHeaderIter *src,
+                                                         GMimeHeaderIter *dest);
+

+Copies src to dest. +

+
++ + + + + + + + + + +

src :

a GMimeHeaderIter +

dest :

a GMimeHeaderIter +
+
+
+
+

g_mime_header_iter_equal ()

+
gboolean            g_mime_header_iter_equal            (GMimeHeaderIter *iter1,
+                                                         GMimeHeaderIter *iter2);
+

+Check that iter1 and iter2 reference the same header. +

+
++ + + + + + + + + + + + + + +

iter1 :

a GMimeHeaderIter +

iter2 :

a GMimeHeaderIter +

Returns :

+TRUE if iter1 and iter2 refer to the same header or +FALSE otherwise.
+
+
+
+

g_mime_header_iter_first ()

+
gboolean            g_mime_header_iter_first            (GMimeHeaderIter *iter);
+

+Updates iter to point to the first header. +

+
++ + + + + + + + + + +

iter :

a GMimeHeaderIter +

Returns :

+TRUE on success or FALSE otherwise.
+
+
+
+

g_mime_header_iter_last ()

+
gboolean            g_mime_header_iter_last             (GMimeHeaderIter *iter);
+

+Updates iter to point to the last header. +

+
++ + + + + + + + + + +

iter :

a GMimeHeaderIter +

Returns :

+TRUE on success or FALSE otherwise.
+
+
+
+

g_mime_header_iter_next ()

+
gboolean            g_mime_header_iter_next             (GMimeHeaderIter *iter);
+

+Advances to the next header. +

+
++ + + + + + + + + + +

iter :

a GMimeHeaderIter +

Returns :

+TRUE on success or FALSE otherwise.
+
+
+
+

g_mime_header_iter_prev ()

+
gboolean            g_mime_header_iter_prev             (GMimeHeaderIter *iter);
+

+Advances to the previous header. +

+
++ + + + + + + + + + +

iter :

a GMimeHeaderIter +

Returns :

+TRUE on success or FALSE otherwise.
+
+
+
+

g_mime_header_iter_is_valid ()

+
gboolean            g_mime_header_iter_is_valid         (GMimeHeaderIter *iter);
+

+Checks if a GMimeHeaderIter is valid. An iterator may become +invalid if the GMimeHeaderList that the iterator refers to +changes. +

+
++ + + + + + + + + + +

iter :

a GMimeHeaderIter +

Returns :

+TRUE if iter is still valid or FALSE otherwise.
+
+
+
+

g_mime_header_iter_get_name ()

+
const char *        g_mime_header_iter_get_name         (GMimeHeaderIter *iter);
+

+Gets the current header's name. +

+
++ + + + + + + + + + +

iter :

a GMimeHeaderIter +

Returns :

the header name or NULL if invalid.
+
+
+
+

g_mime_header_iter_get_value ()

+
const char *        g_mime_header_iter_get_value        (GMimeHeaderIter *iter);
+

+Gets the current header's name. +

+
++ + + + + + + + + + +

iter :

a GMimeHeaderIter +

Returns :

the header name or NULL if invalid.
+
+
+
+

g_mime_header_iter_set_value ()

+
gboolean            g_mime_header_iter_set_value        (GMimeHeaderIter *iter,
+                                                         const char *value);
+

+Sets the current header's value to the new value. +

+
++ + + + + + + + + + + + + + +

iter :

a GMimeHeaderIter +

value :

new header value

Returns :

+TRUE if the value was set or FALSE otherwise (indicates +invalid iter).
+
+
+
+

g_mime_header_iter_remove ()

+
gboolean            g_mime_header_iter_remove           (GMimeHeaderIter *iter);
+

+Removes the current header and advances to the next header. +

+

+Note: If you remove the last header in the list, then iter will +become invalid regardless of whether or not other headers remain. +

+
++ + + + + + + + + + +

iter :

a GMimeHeaderIter +

Returns :

+TRUE on success or FALSE otherwise.
+
+
+
+

g_mime_header_list_new ()

+
GMimeHeaderList *   g_mime_header_list_new              (void);
+

+Creates a new GMimeHeaderList object. +

+
++ + + + +

Returns :

a new header list object.
+
+
+
+

g_mime_header_list_destroy ()

+
void                g_mime_header_list_destroy          (GMimeHeaderList *headers);
+

+Destroy the header list. +

+
++ + + + +

headers :

a GMimeHeaderList +
+
+
+
+

g_mime_header_list_clear ()

+
void                g_mime_header_list_clear            (GMimeHeaderList *headers);
+

+Removes all of the headers from the GMimeHeaderList. +

+
++ + + + +

headers :

a GMimeHeaderList +
+
+
+
+

g_mime_header_list_contains ()

+
gboolean            g_mime_header_list_contains         (const GMimeHeaderList *headers,
+                                                         const char *name);
+

+Checks whether or not a header exists. +

+
++ + + + + + + + + + + + + + +

headers :

a GMimeHeaderList +

name :

header name

Returns :

+TRUE if the specified header exists or FALSE otherwise.
+
+
+
+

g_mime_header_list_prepend ()

+
void                g_mime_header_list_prepend          (GMimeHeaderList *headers,
+                                                         const char *name,
+                                                         const char *value);
+

+Prepends a header. If value is NULL, a space will be set aside +for it (useful for setting the order of headers before values can +be obtained for them) otherwise the header will be unset. +

+
++ + + + + + + + + + + + + + +

headers :

a GMimeHeaderList +

name :

header name

value :

header value
+
+
+
+

g_mime_header_list_append ()

+
void                g_mime_header_list_append           (GMimeHeaderList *headers,
+                                                         const char *name,
+                                                         const char *value);
+

+Appends a header. If value is NULL, a space will be set aside for it +(useful for setting the order of headers before values can be +obtained for them) otherwise the header will be unset. +

+
++ + + + + + + + + + + + + + +

headers :

a GMimeHeaderList +

name :

header name

value :

header value
+
+
+
+

g_mime_header_list_remove ()

+
gboolean            g_mime_header_list_remove           (GMimeHeaderList *headers,
+                                                         const char *name);
+

+Remove the specified header. +

+
++ + + + + + + + + + + + + + +

headers :

a GMimeHeaderList +

name :

header name

Returns :

+TRUE if the header was successfully removed or FALSE if +the specified header could not be found.
+
+
+
+

g_mime_header_list_set ()

+
void                g_mime_header_list_set              (GMimeHeaderList *headers,
+                                                         const char *name,
+                                                         const char *value);
+

+Set the value of the specified header. If value is NULL and the +header, name, had not been previously set, a space will be set +aside for it (useful for setting the order of headers before values +can be obtained for them) otherwise the header will be unset. +

+

+Note: If there are multiple headers with the specified field name, +the first instance of the header will be replaced and further +instances will be removed. +

+
++ + + + + + + + + + + + + + +

headers :

a GMimeHeaderList +

name :

header name

value :

header value
+
+
+
+

g_mime_header_list_get ()

+
const char *        g_mime_header_list_get              (const GMimeHeaderList *headers,
+                                                         const char *name);
+

+Gets the value of the first header with the name requested. +

+
++ + + + + + + + + + + + + + +

headers :

a GMimeHeaderList +

name :

header name

Returns :

the value of the header requested.
+
+
+
+

g_mime_header_list_get_iter ()

+
gboolean            g_mime_header_list_get_iter         (GMimeHeaderList *headers,
+                                                         GMimeHeaderIter *iter);
+

+Initializes an iterator for traversing headers. +

+
++ + + + + + + + + + + + + + +

headers :

a GMimeHeaderList +

iter :

a GMimeHeaderIter +

Returns :

a TRUE if successful or FALSE if there are no headers to +traverse.
+
+
+
+

g_mime_header_list_foreach ()

+
void                g_mime_header_list_foreach          (const GMimeHeaderList *headers,
+                                                         GMimeHeaderForeachFunc func,
+                                                         gpointer user_data);
+

+Calls func for each header name/value pair. +

+
++ + + + + + + + + + + + + + +

headers :

A GMimeHeaderList +

func :

function to be called for each header.

user_data :

User data to be passed to the func.
+
+
+
+

g_mime_header_list_register_writer ()

+
void                g_mime_header_list_register_writer  (GMimeHeaderList *headers,
+                                                         const char *name,
+                                                         GMimeHeaderWriter writer);
+

+Changes the function used to write name headers to writer (or the +default if writer is NULL). This is useful if you want to change +the default header folding style for a particular header. +

+
++ + + + + + + + + + + + + + +

headers :

a GMimeHeaderList +

name :

header name

writer :

writer function
+
+
+
+

g_mime_header_list_write_to_stream ()

+
ssize_t             g_mime_header_list_write_to_stream  (const GMimeHeaderList *headers,
+                                                         GMimeStream *stream);
+

+Write the headers to a stream. +

+
++ + + + + + + + + + + + + + +

headers :

a GMimeHeaderList +

stream :

output stream

Returns :

the number of bytes written or -1 on fail.
+
+
+
+

g_mime_header_list_to_string ()

+
char *              g_mime_header_list_to_string        (const GMimeHeaderList *headers);
+

+Allocates a string buffer containing the raw rfc822 headers +contained in headers. +

+
++ + + + + + + + + + +

headers :

a GMimeHeaderList +

Returns :

a string containing the header block.
+
+
+
+

g_mime_header_list_get_stream ()

+
GMimeStream *       g_mime_header_list_get_stream       (GMimeHeaderList *headers);
+

+Gets the raw stream representing headers. +

+
++ + + + + + + + + + +

headers :

a GMimeHeaderList +

Returns :

a GMimeStream if set or NULL otherwise.
+
+
+
+

g_mime_header_list_set_stream ()

+
void                g_mime_header_list_set_stream       (GMimeHeaderList *headers,
+                                                         GMimeStream *stream);
+

+Set the raw header stream. +

+
++ + + + + + + + + + +

headers :

a GMimeHeaderList +

stream :

a GMimeStream +
+
+
+
+

See Also

+GMimeObject +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-GMimeParam.html b/docs/reference/html/gmime-GMimeParam.html new file mode 100644 index 0000000..df61193 --- /dev/null +++ b/docs/reference/html/gmime-GMimeParam.html @@ -0,0 +1,325 @@ + + + + +GMimeParam + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimeParam

+

GMimeParam — Content-Type and Content-Disposition parameters

+
+
+

Synopsis

+
struct              GMimeParam;
+GMimeParam *        g_mime_param_new                    (const char *name,
+                                                         const char *value);
+GMimeParam *        g_mime_param_new_from_string        (const char *str);
+void                g_mime_param_destroy                (GMimeParam *param);
+const GMimeParam *  g_mime_param_next                   (const GMimeParam *param);
+const char *        g_mime_param_get_name               (const GMimeParam *param);
+const char *        g_mime_param_get_value              (const GMimeParam *param);
+GMimeParam *        g_mime_param_append                 (GMimeParam *params,
+                                                         const char *name,
+                                                         const char *value);
+GMimeParam *        g_mime_param_append_param           (GMimeParam *params,
+                                                         GMimeParam *param);
+void                g_mime_param_write_to_string        (const GMimeParam *param,
+                                                         gboolean fold,
+                                                         GString *str);
+
+
+
+

Description

+

+A GMimeParam is a parameter name/value pair as found on MIME +header fields such as Content-Type and Content-Disposition. +

+
+
+

Details

+
+

struct GMimeParam

+
struct GMimeParam {
+	GMimeParam *next;
+	char *name;
+	char *value;
+};
+
+

+A parameter name/value pair as used for some Content header fields. +

+
++ + + + + + + + + + + + + + +

GMimeParam *next;

Pointer to the next param.

char *name;

Parameter name.

char *value;

Parameter value.
+
+
+
+

g_mime_param_new ()

+
GMimeParam *        g_mime_param_new                    (const char *name,
+                                                         const char *value);
+

+Creates a new GMimeParam node with name name and value value. +

+
++ + + + + + + + + + + + + + +

name :

parameter name

value :

parameter value

Returns :

a new paramter structure.
+
+
+
+

g_mime_param_new_from_string ()

+
GMimeParam *        g_mime_param_new_from_string        (const char *str);
+

+Creates a parameter list based on the input string. +

+
++ + + + + + + + + + +

str :

input string

Returns :

a GMimeParam structure based on string.
+
+
+
+

g_mime_param_destroy ()

+
void                g_mime_param_destroy                (GMimeParam *param);
+

+Releases all memory used by this mime param back to the Operating +System. +

+
++ + + + +

param :

Mime param list to destroy
+
+
+
+

g_mime_param_next ()

+
const GMimeParam *  g_mime_param_next                   (const GMimeParam *param);
+

+Gets the next GMimeParam node in the list. +

+
++ + + + + + + + + + +

param :

a GMimeParam node

Returns :

the next GMimeParam node in the list.
+
+
+
+

g_mime_param_get_name ()

+
const char *        g_mime_param_get_name               (const GMimeParam *param);
+

+Gets the name of the parameter. +

+
++ + + + + + + + + + +

param :

a GMimeParam +

Returns :

the name of the parameter.
+
+
+
+

g_mime_param_get_value ()

+
const char *        g_mime_param_get_value              (const GMimeParam *param);
+

+Gets the value of the parameter. +

+
++ + + + + + + + + + +

param :

a GMimeParam +

Returns :

the value of the parameter.
+
+
+
+

g_mime_param_append ()

+
GMimeParam *        g_mime_param_append                 (GMimeParam *params,
+                                                         const char *name,
+                                                         const char *value);
+

+Appends a new parameter with name name and value value to the +parameter list params. +

+
++ + + + + + + + + + + + + + + + + + +

params :

param list

name :

new param name

value :

new param value

Returns :

a param list with the new param of name name and value +value appended to the list of params params.
+
+
+
+

g_mime_param_append_param ()

+
GMimeParam *        g_mime_param_append_param           (GMimeParam *params,
+                                                         GMimeParam *param);
+

+Appends param to the param list params. +

+
++ + + + + + + + + + + + + + +

params :

param list

param :

param to append

Returns :

a param list with the new param param appended to the list +of params params.
+
+
+
+

g_mime_param_write_to_string ()

+
void                g_mime_param_write_to_string        (const GMimeParam *param,
+                                                         gboolean fold,
+                                                         GString *str);
+

+Assumes the output string contains only the Content-* header and +it's immediate value. +

+

+Writes the params out to the string string. +

+
++ + + + + + + + + + + + + + +

param :

MIME Param list

fold :

specifies whether or not to fold headers

str :

output string
+
+
+
+

See Also

+GMimeContentType +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-GMimePartIter.html b/docs/reference/html/gmime-GMimePartIter.html new file mode 100644 index 0000000..3e949c6 --- /dev/null +++ b/docs/reference/html/gmime-GMimePartIter.html @@ -0,0 +1,388 @@ + + + + +GMimePartIter + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMimePartIter

+

GMimePartIter — MIME part iterators

+
+ +
+

Description

+

+GMimePartIter is an iterator for traversing a GMimeObject tree in +Depth-First order. +

+
+
+

Details

+
+

GMimePartIter

+
typedef struct _GMimePartIter GMimePartIter;
+

+A MIME part iterator. +

+
+
+
+

g_mime_part_iter_new ()

+
GMimePartIter *     g_mime_part_iter_new                (GMimeObject *toplevel);
+

+Creates a new GMimePartIter for iterating over toplevel's subparts. +

+
++ + + + + + + + + + +

toplevel :

a GMimeObject to use as the toplevel

Returns :

a newly allocated GMimePartIter which should be freed +using g_mime_part_iter_free() when finished with it.
+
+
+
+

g_mime_part_iter_free ()

+
void                g_mime_part_iter_free               (GMimePartIter *iter);
+

+Frees the memory allocated by g_mime_part_iter_new(). +

+
++ + + + +

iter :

a GMimePartIter +
+
+
+
+

g_mime_part_iter_reset ()

+
void                g_mime_part_iter_reset              (GMimePartIter *iter);
+

+Resets the state of iter to its initial state. +

+
++ + + + +

iter :

a GMimePartIter +
+
+
+
+

g_mime_part_iter_jump_to ()

+
gboolean            g_mime_part_iter_jump_to            (GMimePartIter *iter,
+                                                         const char *path);
+

+Updates the state of iter to point to the GMimeObject specified +by path. +

+
++ + + + + + + + + + + + + + +

iter :

a GMimePartIter +

path :

a string representing the path to jump to

Returns :

+TRUE if the GMimeObject specified by path exists or +FALSE otherwise.
+
+
+
+

g_mime_part_iter_is_valid ()

+
gboolean            g_mime_part_iter_is_valid           (GMimePartIter *iter);
+

+Checks that the current state of iter is valid. +

+
++ + + + + + + + + + +

iter :

a GMimePartIter +

Returns :

+TRUE if iter is valid or FALSE otherwise.
+
+
+
+

g_mime_part_iter_next ()

+
gboolean            g_mime_part_iter_next               (GMimePartIter *iter);
+

+Advances to the next part in the MIME structure used to initialize +iter. +

+
++ + + + + + + + + + +

iter :

a GMimePartIter +

Returns :

+TRUE if successful or FALSE otherwise.
+
+
+
+

g_mime_part_iter_prev ()

+
gboolean            g_mime_part_iter_prev               (GMimePartIter *iter);
+

+Rewinds to the previous part in the MIME structure used to +initialize iter. +

+
++ + + + + + + + + + +

iter :

a GMimePartIter +

Returns :

+TRUE if successful or FALSE otherwise.
+
+
+
+

g_mime_part_iter_get_toplevel ()

+
GMimeObject *       g_mime_part_iter_get_toplevel       (GMimePartIter *iter);
+

+Gets the toplevel GMimeObject used to initialize iter. +

+
++ + + + + + + + + + +

iter :

a GMimePartIter +

Returns :

the toplevel GMimeObject.
+
+
+
+

g_mime_part_iter_get_current ()

+
GMimeObject *       g_mime_part_iter_get_current        (GMimePartIter *iter);
+

+Gets the GMimeObject at the current GMimePartIter position. +

+
++ + + + + + + + + + +

iter :

a GMimePartIter +

Returns :

the current GMimeObject or NULL if the state of iter is +invalid.
+
+
+
+

g_mime_part_iter_get_parent ()

+
GMimeObject *       g_mime_part_iter_get_parent         (GMimePartIter *iter);
+

+Gets the parent of the GMimeObject at the current GMimePartIter +position. +

+
++ + + + + + + + + + +

iter :

a GMimePartIter +

Returns :

the parent GMimeObject or NULL if the state of iter is +invalid.
+
+
+
+

g_mime_part_iter_get_path ()

+
char *              g_mime_part_iter_get_path           (GMimePartIter *iter);
+

+Gets the path of the current GMimeObject in the MIME structure +used to initialize iter. +

+
++ + + + + + + + + + +

iter :

a GMimePartIter +

Returns :

a newly allocated string representation of the path to the +GMimeObject at the current GMimePartIter position.
+
+
+
+

g_mime_part_iter_replace ()

+
gboolean            g_mime_part_iter_replace            (GMimePartIter *iter,
+                                                         GMimeObject *replacement);
+

+Replaces the GMimeObject at the current position with replacement. +

+
++ + + + + + + + + + + + + + +

iter :

a GMimePartIter +

replacement :

a GMimeObject +

Returns :

+TRUE if the part at the current position was replaced or +FALSE otherwise.
+
+
+
+

g_mime_part_iter_remove ()

+
gboolean            g_mime_part_iter_remove             (GMimePartIter *iter);
+

+Removes the GMimeObject at the current position from its +parent. If successful, iter is advanced to the next position +(since the current position will become invalid). +

+
++ + + + + + + + + + +

iter :

a GMimePartIter +

Returns :

+TRUE if the part at the current position was removed or +FALSE otherwise.
+
+
+
+

See Also

+GMimeObject +
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-building.html b/docs/reference/html/gmime-building.html new file mode 100644 index 0000000..977ebf4 --- /dev/null +++ b/docs/reference/html/gmime-building.html @@ -0,0 +1,284 @@ + + + + +Compiling the GMime libraries + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Compiling the GMime libraries

+

Compiling the GMime Libraries — How to compile GMime itself

+
+
+

Building GMime on UNIX-like systems

+

+ This chapter covers building and installing GMime on UNIX and + UNIX-like systems such as Linux. Compiling GMime on Microsoft + Windows is not a goal of the project, however if you are able + build on a Microsoft Windows platform, do send me building and + installing instructions and I will add them to this document. +

+

+ Before we get into the details of how to compile GMime, I should + mention that binary packages of GMime prebuilt for your operating + system may be available either from your operating system vendor + or from independent sources such as http://rpmfind.net. If you + can find them, it may be the easiest way of getting started + developing GMime. +

+

+ On UNIX-like systems GMime uses the standard GNU build system, + using autoconf for package + configuration and resolving portability issues, + automake for building makefiles that + comply with the GNU Coding Standards, and + libtool for building shared libraries + on multiple platforms. +

+

+ If you are building GMime from the distributed source packages, + then you won't need these tools installed; the necessary pieces + of the tools are already included in the source packages. But + it's useful to know a bit about how packages that use these + tools work. A source package is distributed as a + tar.gz file which you unpack into a + directory full of the source files as follows: +

+
+      tar -zxvf gmime-2.6.x.tar.gz
+    
+

+ In the toplevel of the directory that is created, there will be + a shell script called configure which + you then run to take the template makefiles called + Makefile.in in the package and create + makefiles customized for your operating system. The + configure script can be passed various + command line arguments to determine how the package is built and + installed. The most commonly useful argument is the + --prefix argument which specifies where + the package is installed. To install a package into + /opt/gmime you would run configure as: +

+
+      ./configure --prefix=/opt/gmime
+    
+

+ A full list of options can be found by running + configure with the + --help argument. In general, the defaults + are right and should be trusted. After you've run + configure, you then run the + make command to build the package and install + it. +

+
+      make
+      make install
+    
+

+ If you don't have permission to write to the directory you are + installing in, you may have to change to root temporarily before + running make install. A quick way to do this is + to use the su command with the + -c option + (ex. su -c "make install"). Also, if you are + installing in a system directory, on some systems (such as + Linux), you will need to run ldconfig after + make install so that the newly installed + libraries will be found. +

+

+ Several environment variables are useful to pass to set before + running configure. CPPFLAGS contains options to + pass to the C compiler, and is used to tell the compiler where + to look for include files. The LDFLAGS variable + is used in a similar fashion for the linker. Finally the + PKG_CONFIG_PATH environment variable contains + a search path that pkg-config (see below) + uses when looking for a file describing how to compile + programs using different libraries. If you were installing GMime + and it's dependencies into /opt/gmime, you + might want to set these variables as: +

+
+      CPPFLAGS="-I/opt/gmime/include"
+      LDFLAGS="-L/opt/gmime/lib"
+      PKG_CONFIG_PATH="/opt/gmime/lib/pkgconfig"
+      export CPPFLAGS LDFLAGS PKG_CONFIG_PATH
+    
+

+ You may also need to set the LD_LIBRARY_PATH + environment variable so the systems dynamic linker can find + the newly installed libraries, and the PATH + environment program so that utility binaries installed by + the various libraries will be found. +

+
+      LD_LIBRARY_PATH="/opt/gmime/lib"
+      PATH="/opt/gmime/bin:$PATH"
+      export LD_LIBRARY_PATH PATH
+    
+
+
+

Dependencies

+

+ Before you can compile the GMime library, you need to have + various other tools and libraries installed on your + system. The two tools needed during the build process (as + differentiated from the tools used in when creating GMime + mentioned above such as autoconf) + are pkg-config and GNU make. +

+
    +
  • pkg-config + is a tool for tracking the compilation flags needed for + libraries that are used by the GMime libraries. (For each + library, a small .pc text file is installed in a standard + location that contains the compilation flags needed for that + library along with version number information.) The version + of pkg-config needed to build GMime is + mirrored in the dependencies directory + on the GTK+ FTP + site.

  • +
  • + The GMime makefiles will mostly work with different versions + of make, however, there tends to be + a few incompatibilities, so the GMime team recommends + installing GNU + make if you don't already have it on your system + and using it. (It may be called gmake + rather than make.) +

  • +
+

+ GMime depends on the existance of two (2) libraries: GLib and iconv. +

+
    +
  • + The GLib library provides core non-graphical functionality + such as high level data types, Unicode manipulation, and + a object and type system to C programs. It is available + from the GTK+ + FTP site. +

  • +
  • + The GNU + libiconv library is needed to build GLib and GMime + if your system doesn't already have the + iconv() function for doing conversion + between character encodings. Most modern systems should have + iconv(). +

  • +
+
+
+

Building and testing GMime

+

+ First make sure that you have the necessary external + dependencies installed: pkg-config, GNU make, + and, if necessary, libiconv. To get detailed information about + building these packages, see the documentation provided with the + individual packages. On a newer Linux system, it's quite likely + that you'll have all of these installed already. +

+

+ Then build and install the GMime libraries in the order: + libiconv, GLib, then GMime. For each library, follow the + steps of configure, make, + make install mentioned above. If you're + lucky, this will all go smoothly, and you'll be ready to + start compiling your own GMime + applications. You can test your GMime installation + by running pkg-config --modversion gmime-2.6 + and making sure that it can both find GMime and reports the + correct version. +

+

+ If one of the configure scripts fails or running + make fails, look closely at the error + messages printed; these will often provide useful information + as to what went wrong. When configure + fails, extra information, such as errors that a test compilation + ran into, is found in the file config.log. + Looking at the last couple of hundred lines in this file will + frequently make clear what went wrong. If all else fails, you + can ask for help by emailing me, fejj@gnome.org +

+
+
+

Extra Configuration Options

+

+ In addition to the normal options, the + configure script for the GMime library + supports a number of additional arguments. (Command line + arguments for the other GMime libraries are described in + the documentation distributed with those libraries.) + +

+

./configure [[--enable-profiling] | [--enable-warnings] | [--enable-mono] | [--enable-gtk-doc] | [--enable-largfile]]

+

+

+

+ --enable-profiling + .  + Normally GMime will not pass the -pg flag to + gcc when building. This option will enable + the use of that flag thus building profiling information into + the GMime libraries for use with the GNU Profiler, gprof. Odds + are you do not care about this option unless you are either me + or desire to profile GMime and/or your program. +

+

+ --enable-warnings + .  + This option enables parser warnings about invalid MIME to be + logged to stderr at runtime. Again, it is unlikely you will + care to use this option. +

+

+ --enable-mono + .  + This option will include the Mono .NET bindings as part of + the build. +

+

+ --enable-gtk-doc + .  + This option will enable the building of the reference + documentation for GMime (e.g. the html pages you are + reading now). +

+

+ --enable-largefile + .  + This option will enable large file support (e.g. files larger + than 2GB) on 32bit systems. This flag is enabled by default + starting with GMime 2.4.5. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-changes-2-0.html b/docs/reference/html/gmime-changes-2-0.html new file mode 100644 index 0000000..7eea5ff --- /dev/null +++ b/docs/reference/html/gmime-changes-2-0.html @@ -0,0 +1,135 @@ + + + + +Changes from 1.0 to 2.0 + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Changes from 1.0 to 2.0

+

Changes from 1.0 to 2.0 — +Incompatible changes made between version 1.0 and version 2.0 +

+
+
+

Incompatible changes from 1.0 to 2.0

+

+See also the PORTING document in the toplevel GMime source directory. +

+

+The major change here is that I've dropped my own base object class +and have replaced it with GObject from glib-2.0. This should be a +pleasant change since you (the developer) will now be able to do many +more things such as setting arbitrary data on all GMime objects. For +additional information about GObject, please see the GObject Reference +Manual at http://developer.gnome.org/doc/API/2.0/gobject/ +

+
    +
  • +The first thing you need to know is that any function returning a +non-const pointer to any object /must/ be unref'd when you are done +with it. Since all objects in GMime now subclass GObject, you may +safely use g_object_unref() +(GMimeStream's may also be unref'd using +g_mime_stream_unref(), but either way is fine). + +Don't forget that +g_mime_part_get_content_object() returns a +ref-counted GMimeDataWrapper object now, and +so you /must/ unref it when you have finished using it. You must also +remember to unref any GMimeDataWrapper object that you /set/ on a +GMimePart using g_mime_part_set_content_object() +as the GMimePart will now ref the content object that you set on it. +

  • +
  • GMimeMultipart is a new class which is to be +used for all multipart MIME parts rather than GMimePart (as in +1.0). There are also some subclasses of GMimeMultipart for other +things. +

  • +
  • g_mime_part_[g,s]et_boundary() have been removed +(see above). You must now create a GMimeMultipart object and use +g_mime_multipart_[g,s]et_boundary(). +

  • +
  • g_mime_part_add_subpart() has been replaced with +g_mime_multipart_add_part(). +

  • +
  • g_mime_part_foreach() has been replaced with +g_mime_multipart_foreach() and/or +g_mime_message_foreach_part(). +

  • +
  • g_mime_part_get_subpart_from_content_id() has +been replaced with +g_mime_multipart_get_subpart_from_content_id(). +

  • +
  • +Another new class is GMimeMessagePart which +is to be used for all MIME parts containing an rfc822 message. All 1.0 +GMimePart's representing message/rfc822 parts (as well as message/news +parts?) need to be migrated over to be GMimeMessagePart objects. +

  • +
  • GMimeMessagePartial is another class meant +for handling the message/partial MIME type. All 1.0 GMimePart's +holding data of this type should be replaced with GMimeMessagePartial +objects. +

  • +
  • g_mime_message_write_to_stream() and +g_mime_part_write_to_stream() functions have been +consolidated into a virtual method. Replace calls to these functions +with g_mime_object_write_to_stream(). Note: while +g_mime_part_write_to_stream() and +g_mime_message_write_to_stream() still exist, it +is suggested you migrate to +g_mime_object_write_to_stream(). Same goes for +g_mime_part_to_string() and +g_mime_message_to_string(). +

  • +
  • GMimeMessage's structure has changed a +bit. You will not be able to do message->header, +instead you want to do ((GMimeObject *) +message)->header. +

  • +
  • g_mime_message_set_message_id() now takes a +message_id argument without the encapsulating < and >'s (it now +just takes the addr-spec portion of the msg-id). +

  • +
  • GMimeFilterFrom has changed slightly, you +will want to replace all calls to +g_mime_filter_from_new() with +g_mime_filter_from_new +(GMIME_FILTER_FROM_MODE_DEFAULT) +(GMIME_FILTER_FROM_MODE_DEFAULT is equivalent to (int) 0). +

  • +
  • GMimeParser is a brand new class and +gmime-parser.h has had a number of API additions. +g_mime_parser_construct_part() and +g_mime_parser_construct_message() still exist, +however they no longer take a GMimeStream argument. Instead, they take +a GMimeParser object. +

  • +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-changes-2-2.html b/docs/reference/html/gmime-changes-2-2.html new file mode 100644 index 0000000..b433704 --- /dev/null +++ b/docs/reference/html/gmime-changes-2-2.html @@ -0,0 +1,91 @@ + + + + +Changes from 2.0 to 2.2 + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Changes from 2.0 to 2.2

+

Changes from 2.0 to 2.2 — Incompatible changes made between version 2.0 and version 2.2

+
+
+

Incompatible changes from 2.0 to 2.2

+

See also the PORTING document in the toplevel GMime source directory.

+

There are no incompatible changes between 2.0 and 2.2.

+

GMime 2.2 is both API and ABI compatible with GMime 2.0 meaning +that any program written for GMime 2.0 will compile fine with GMime +2.2 and any program linked against GMime 2.0's libraries will also +work with GMime 2.2's libraries.

+

Most of the changes made between 2.0 and 2.2 were internal but there +are a few API changes you should be aware of (as these interfaces will +be deprecated in some future version, probably 3.0).

+
+
+

Replacement interfaces from 2.0 to 2.2

+
    +
  • +g_mime_utils_8bit_header_decode() has been split +into 2 functions. We now have +g_mime_utils_header_decode_text() and +g_mime_utils_header_decode_phrase(). +g_mime_utils_header_decode_text() no longer +requires encoded-words to be rfc822 atoms. +g_mime_utils_header_decode_phrase() is +still strict in that encoded-words MUST be valid rfc822 atoms.

  • +
  • +g_mime_utils_8bit_header_encode() has been +renamed to g_mime_utils_header_encode_text() to +be more clear as to what type of header this is supposed to encode. If +you haven't guessed, this function is for encoding rfc822 'text' +headers (such as Subject).

  • +
  • +g_mime_utils_8bit_header_encode_phrase() has been +renamed to g_mime_utils_header_encode_phrase() +mostly for consistancy with the previous 2 changes.

  • +
  • +g_mime_charset_name() has been renamed to +g_mime_charset_iconv_name() for clarity.

  • +
  • +g_mime_charset_locale_name() has been renamed to +g_mime_locale_charset().

  • +
  • +g_mime_cipher_context_verify() no longer returns +a GMimeCipherValidity, instead it returns a +GMimeSignatureValidity which is far more +useful. Never fear, you may still use the +GMimeCipherValidity APIs for the time being - +they work fine given a GMimeSignatureValidity +structure.

  • +
  • +g_mime_multipart_signed_verify() also now returns +a GMimeSignatureValidity structure rather than +a GMimeCipherValidity structure. See changes to +g_mime_cipher_context_verify() for details.

  • +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-changes-2-4.html b/docs/reference/html/gmime-changes-2-4.html new file mode 100644 index 0000000..4ae5345 --- /dev/null +++ b/docs/reference/html/gmime-changes-2-4.html @@ -0,0 +1,82 @@ + + + + +Changes from 2.2 to 2.4 + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Changes from 2.2 to 2.4

+

Changes from 2.2 to 2.4 — Changes made between version 2.2 and version 2.4

+
+
+

Changes from 2.2 to 2.4

+

GMime 2.4 has had a number of API changes since GMime +2.2. To start, ALL public APIs that used to use off_t in GMime 2.2 now +use gint64 so that the API and ABI do not change based on whether or +not large file support is enabled.

+

In addition, all of the functions marked as deprecated in +2.0 and 2.2 were removed (usually they had equivalent functionality in +a parent class).

+

Many functions have also been renamed for better clarity +and/or consistency. For convenience, GMime 2.4 source packages include +a shell-script to aid in porting applications using GMime 2.2 (should +work for most GMime 2.0 applications as well) to the 2.4 API. You can +find this script under the tools/ directory, named +`gmime-port-2-2-to-2-4.sh'.

+

This script won't fix everything, but it should help quite a +bit.

+

Beyond that, a few methods have changed in other ways:

+
    +
  • g_mime_cipher_context_sign() + still returns int, but if the value isn't -1 (failure), then it will + represent a GMimeCipherHash that it used for signing. This is + useful, for example, when the requested hash was + GMIME_CIPHER_HASH_DEFAULT.

  • +
  • g_mime_cipher_context_decrypt() + now returns a GMimeSignatureValidty on success and NULL on + failure. This is needed in case the encrypted stream was also + signed.

  • +
  • g_mime_multipart_encrypted_encrypt() + now takes a boolean 'sign' argument to allow the caller to request + encrypting and signing in a single pass.

  • +
+

Several structs have also been rewritten to subclass GObject like +GMimeContentType and GMimeContentDisposition as well as +InternetAddress and InternetAddressList.

+

Not only have InternetAddress and InternetAddressList been ported to +GObject, but they have also undergone other design +changes. InternetAddress is now a base class for +InternetAddressMailbox and InternetAddressGroup, meaning that +InternetAddress no longer contains a union for group/addr fields.

+

All functions that return a GObject have been changed to not add a ref +to the object returned, meaning that it is no longer necessary to call +g_object_unref() on MIME parts returned from functions like +g_mime_message_get_mime_part() or g_mime_multipart_get_part(). This +was done to be more consistent with the Gtk+ API.

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-changes-2-6.html b/docs/reference/html/gmime-changes-2-6.html new file mode 100644 index 0000000..6e65fb2 --- /dev/null +++ b/docs/reference/html/gmime-changes-2-6.html @@ -0,0 +1,90 @@ + + + + +Changes from 2.4 to 2.6 + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Changes from 2.4 to 2.6

+

Changes from 2.4 to 2.6 — Changes made between version 2.4 and version 2.6

+
+
+

Changes from 2.4 to 2.6

+

After releasing GMime 2.4, it was discovered that +g_mime_stream_length() still returned ssize_t which, on 32bit systems, +meant that the function was useless if the actual stream was larger +than 2GB (which could happen if GMime was built with large file +support).

+

As I fixed this, I also found some API inconsistencies which I felt I +might as well fix up since I had to break API/ABI compatibility with +2.4 anyway.

+

Most notable in GMime 2.6 is the lack of GMimeSession which has been +dropped in favor of a much simpler callback +mechanism. GMimeCipherContexts constructors now take a +password_request callback function rather than forcing you to subclass +GMimeSession to get this functionality.

+

Other API changes include:

+
    +
  • GMimeBestEncoding has been renamed to + GMimeEncodingConstraint

  • +
  • GMimeSignatureValidity has been dropped in favor + of GMimeSignatureList which is simply a collection of + signatures. +

  • +
  • GMimeSigner has been replaced by GMimeSignature + and GMimeCertificate which added a number of new fields and + accessors making it much more complete. +

  • +
  • GMimeCipherContext has been renamed to + GMimeCryptoContext and the method names for this class have also + been renamed in a similar fashion. +

  • +
  • g_mime_crypto_context_encrypt() + now takes a digest algorithm argument which is used when the + 'sign' argument is TRUE. +

  • +
  • g_mime_multipart_encrypted_encrypt() + also now takes a digest algorithm argument which it passes along + to g_mime_crypto_context_encrypt(). +

  • +
  • g_mime_crypto_context_decrypt() + now returns a GMimeDecryptResult which contains a list of + signatures (if signed), a list of recipients that the stream had + been encrypted to, and also the cipher and digest algorithms + used. +

  • +
  • g_mime_multipart_encrypted_decrypt() + no longer caches the decrypted part and also now takes a + GMimeSignatureList** output argument which it sets in place of + having to call + g_mime_multipart_encrypted_get_signature_validity() + afterward. +

  • +
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-compiling.html b/docs/reference/html/gmime-compiling.html new file mode 100644 index 0000000..e5aee65 --- /dev/null +++ b/docs/reference/html/gmime-compiling.html @@ -0,0 +1,70 @@ + + + + +Compiling GMime Applications + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Compiling GMime Applications

+

Compiling GMime Applications — +How to compile your GMime application +

+
+
+

Compiling GMime Applications on UNIX

+

+To compile a GMime application, you need to tell the compiler where to +find the GMime header files and libraries. This is done with the +pkg-config utility. +

+

+The following interactive shell session demonstrates how +pkg-config is used: +

+
+$ pkg-config --cflags gmime-2.4
+ -I/usr/include/gmime-2.4 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include 
+$ pkg-config --libs gmime-2.4
+ -L/opt/gnome2/lib -lgmime-2.4 -lnsl -lgobject-2.0 -lglib-2.0
+
+

+

+

+The simplest way to compile a program is to use the "backticks" +feature of the shell. If you enclose a command in backticks +(not single quotes), then its output will be +substituted into the command line before execution. So to compile +a GTK+ Hello, World, you would type the following: +

+
+$ cc `pkg-config --cflags --libs gmime-2.4` hello.c -o hello
+
+

+

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-data-wrappers.html b/docs/reference/html/gmime-data-wrappers.html new file mode 100644 index 0000000..01ab340 --- /dev/null +++ b/docs/reference/html/gmime-data-wrappers.html @@ -0,0 +1,46 @@ + + + + +GMime Data Wrappers + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMime Data Wrappers

+

GMime Data Wrappers — How to use GMime Data Wrappers

+
+
+

Overview of Data Wrappers

+

Data wrappers are very simple. A GMimeDataWrapper object + contains both a stream and an encoding-type. The encoding-type + (such as GMIME_PART_ENCODING_BASE64) is used by + g_mime_data_wrapper_write_to_stream() in order to decode the data + into its unencoded form. This means that you, the application + programmer, do not need to worry about decoding the content stream + yourself.

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-filters.html b/docs/reference/html/gmime-filters.html new file mode 100644 index 0000000..8600097 --- /dev/null +++ b/docs/reference/html/gmime-filters.html @@ -0,0 +1,72 @@ + + + + +GMime Stream Filters + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMime Stream Filters

+

GMime Stream Filters — How to use GMime Stream Filters

+
+
+

Overview of Filters

+

Stream filters are an efficient way of converting data from + one format to another. To use a stream filter, you must first + construct a GMimeStreamFilter stream and then add the desired + filters to it.

+

GMime comes equipped with some basic filters such as + GMimeFilterBasic, GMimeFilterCharset, GMimeFilterCRLF, + GMimeFilterFrom and GMimeFilterHTML.

+

The GMimeFilterBasic filter is actually a collection of + filters for common transfer encodings used by MIME. So far, it is + able to handle encoding and decoding of base64, quoted-printable + and (x-)uuencode.

+

For internationalization support, GMime also includes a + filter for converting between any 2 charsets, + GMimeFilterCharset. With this filter, mail user agents can allow + the user to read the message content in his or her own + charset.

+

A common conversion needed for text is CRLF -> LF and LF -> + CRLF which is needed for most (all?) internet protocols. Luckily, + GMime comes equipped with a filter to handle this for you, + GMimeFilterCRLF. You'll notice that GMimeFilterCRLF can also + handle dot-escaping, which is especially useful for SMTP + (rfc821).

+

On Unix systems, mail often resides in spools in mbox + format. Mbox uses a line that starts with "From " to delimit + messages which means that message bodies are forbidden to contain + lines starting with "From ". The common way to escape these from + lines in message bodies is to prepend the line with a greater-than + character ('>') producing ">From ". You'll find GMimeFilterFrom + handy when dealing with this.

+

The GMimeFilterHTML filter converts a normal text stream + into an html stream. This is especially useful if you are using a + widget such as GtkHTML to display the contents of an email + message.

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-gmime-charset.html b/docs/reference/html/gmime-gmime-charset.html new file mode 100644 index 0000000..918f546 --- /dev/null +++ b/docs/reference/html/gmime-gmime-charset.html @@ -0,0 +1,465 @@ + + + + +gmime-charset + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime-charset

+

gmime-charset — Charset helper functions

+
+
+

Synopsis

+
                    GMimeCharset;
+void                g_mime_charset_map_init             (void);
+void                g_mime_charset_map_shutdown         (void);
+const char *        g_mime_locale_charset               (void);
+const char *        g_mime_locale_language              (void);
+const char *        g_mime_charset_language             (const char *charset);
+const char *        g_mime_charset_canon_name           (const char *charset);
+const char *        g_mime_charset_iconv_name           (const char *charset);
+const char *        g_mime_charset_name                 (const char *charset);
+const char *        g_mime_charset_locale_name          (void);
+const char *        g_mime_charset_iso_to_windows       (const char *isocharset);
+void                g_mime_charset_init                 (GMimeCharset *charset);
+void                g_mime_charset_step                 (GMimeCharset *charset,
+                                                         const char *inbuf,
+                                                         size_t inlen);
+const char *        g_mime_charset_best_name            (GMimeCharset *charset);
+const char *        g_mime_charset_best                 (const char *inbuf,
+                                                         size_t inlen);
+gboolean            g_mime_charset_can_encode           (GMimeCharset *mask,
+                                                         const char *charset,
+                                                         const char *text,
+                                                         size_t len);
+void                g_mime_set_user_charsets            (const char **charsets);
+const char **       g_mime_user_charsets                (void);
+
+
+
+

Description

+

+Charset utility functions. +

+
+
+

Details

+
+

GMimeCharset

+
typedef struct {
+	unsigned int mask;
+	unsigned int level;
+} GMimeCharset;
+
+

+State used by g_mime_charset_best() and g_mime_charset_best_name(). +

+
++ + + + + + + + + + +

unsigned int mask;

charset mask

unsigned int level;

charset level
+
+
+
+

g_mime_charset_map_init ()

+
void                g_mime_charset_map_init             (void);
+

+Initializes character set maps. +

+

+Note: g_mime_init() calls this routine for you. +

+
+
+
+

g_mime_charset_map_shutdown ()

+
void                g_mime_charset_map_shutdown         (void);
+

+Frees internal lookup tables created in g_mime_charset_map_init(). +

+
+
+
+

g_mime_locale_charset ()

+
const char *        g_mime_locale_charset               (void);
+

+Gets the user's locale charset (or iso-8859-1 by default). +

+
++ + + + +

Returns :

the user's locale charset (or iso-8859-1 by default).
+
+
+
+

g_mime_locale_language ()

+
const char *        g_mime_locale_language              (void);
+

+Gets the user's locale language code (or NULL by default). +

+
++ + + + +

Returns :

the user's locale language code (or NULL by default).
+
+
+
+

g_mime_charset_language ()

+
const char *        g_mime_charset_language             (const char *charset);
+

+Attempts to find a specific language code that is specific to +charset. Currently only handles CJK and Russian/Ukranian +charset->lang mapping. Everything else will return NULL. +

+
++ + + + + + + + + + +

charset :

charset name

Returns :

a language code that is specific to charset, or NULL on +fail.
+
+
+
+

g_mime_charset_canon_name ()

+
const char *        g_mime_charset_canon_name           (const char *charset);
+

+Attempts to find a canonical charset name for charset. +

+

+Note: Will normally return the same value as +g_mime_charset_iconv_name() unless the system iconv does not use +the canonical ISO charset names (such as using ISO8859-1 rather +than the canonical form ISO-8859-1). +

+
++ + + + + + + + + + +

charset :

charset name

Returns :

a canonical charset name for charset.
+
+
+
+

g_mime_charset_iconv_name ()

+
const char *        g_mime_charset_iconv_name           (const char *charset);
+

+Attempts to find an iconv-friendly charset name for charset. +

+
++ + + + + + + + + + +

charset :

charset name

Returns :

an iconv-friendly charset name for charset.
+
+
+
+

g_mime_charset_name ()

+
const char *        g_mime_charset_name                 (const char *charset);
+
+

Warning

+

g_mime_charset_name is deprecated and should not be used in newly-written code.

+
+

+Attempts to find an iconv-friendly charset name for charset. +

+

+Note: This function is deprecated. Use g_mime_charset_iconv_name() +instead. +

+
++ + + + + + + + + + +

charset :

charset name

Returns :

an iconv-friendly charset name for charset.
+
+
+
+

g_mime_charset_locale_name ()

+
const char *        g_mime_charset_locale_name          (void);
+
+

Warning

+

g_mime_charset_locale_name is deprecated and should not be used in newly-written code.

+
+

+Gets the user's locale charset (or iso-8859-1 by default). +

+

+Note: This function is deprecated. Use g_mime_locale_charset() +instead. +

+
++ + + + +

Returns :

the user's locale charset (or iso-8859-1 by default).
+
+
+
+

g_mime_charset_iso_to_windows ()

+
const char *        g_mime_charset_iso_to_windows       (const char *isocharset);
+

+Maps the ISO-8859-# charset to the equivalent Windows-CP125# +charset. +

+
++ + + + + + + + + + +

isocharset :

ISO-8859-# charset

Returns :

equivalent Windows charset.
+
+
+
+

g_mime_charset_init ()

+
void                g_mime_charset_init                 (GMimeCharset *charset);
+

+Initializes a charset mask structure. +

+
++ + + + +

charset :

charset mask
+
+
+
+

g_mime_charset_step ()

+
void                g_mime_charset_step                 (GMimeCharset *charset,
+                                                         const char *inbuf,
+                                                         size_t inlen);
+

+Steps through the input buffer 1 unicode character (glyph) at a +time (ie, not necessarily 1 byte at a time). Bitwise 'and' our +charset->mask with the mask for each glyph. This has the effect of +limiting what charsets our charset->mask can match. +

+
++ + + + + + + + + + + + + + +

charset :

charset structure

inbuf :

input text buffer (must be in UTF-8)

inlen :

input buffer length
+
+
+
+

g_mime_charset_best_name ()

+
const char *        g_mime_charset_best_name            (GMimeCharset *charset);
+

+Gets the best charset name based on the charset mask charset. +

+
++ + + + + + + + + + +

charset :

charset mask

Returns :

a pointer to a string containing the best charset name that +can represent the charset mask charset.
+
+
+
+

g_mime_charset_best ()

+
const char *        g_mime_charset_best                 (const char *inbuf,
+                                                         size_t inlen);
+

+Computes the best charset to use to encode this text buffer. +

+
++ + + + + + + + + + + + + + +

inbuf :

a UTF-8 text buffer

inlen :

input buffer length

Returns :

the charset name best suited for the input text or NULL if +it is US-ASCII safe.
+
+
+
+

g_mime_charset_can_encode ()

+
gboolean            g_mime_charset_can_encode           (GMimeCharset *mask,
+                                                         const char *charset,
+                                                         const char *text,
+                                                         size_t len);
+

+Check to see if the UTF-8 text will fit safely within charset. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

mask :

a GMimeCharset mask

charset :

a charset

text :

utf-8 text to check

len :

length of text +

Returns :

+TRUE if it is safe to encode text into charset or FALSE +otherwise.
+
+
+
+

g_mime_set_user_charsets ()

+
void                g_mime_set_user_charsets            (const char **charsets);
+

+Set a list of charsets for GMime to use as a hint for encoding and +decoding headers. The charset list should be in order of preference +(e.g. most preferred first, least preferred last). +

+
++ + + + +

charsets :

an array of user-preferred charsets
+
+
+
+

g_mime_user_charsets ()

+
const char **       g_mime_user_charsets                (void);
+

+Get the list of user-preferred charsets set with +g_mime_set_user_charsets(). +

+
++ + + + +

Returns :

an array of user-set charsets or NULL if none set.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-gmime-encodings.html b/docs/reference/html/gmime-gmime-encodings.html new file mode 100644 index 0000000..47c2475 --- /dev/null +++ b/docs/reference/html/gmime-gmime-encodings.html @@ -0,0 +1,992 @@ + + + + +gmime-encodings + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime-encodings

+

gmime-encodings — MIME encoding functions

+
+
+

Synopsis

+
enum                GMimeContentEncoding;
+GMimeContentEncoding g_mime_content_encoding_from_string
+                                                        (const char *str);
+const char *        g_mime_content_encoding_to_string   (GMimeContentEncoding encoding);
+enum                GMimeEncodingConstraint;
+                    GMimeEncoding;
+void                g_mime_encoding_init_encode         (GMimeEncoding *state,
+                                                         GMimeContentEncoding encoding);
+void                g_mime_encoding_init_decode         (GMimeEncoding *state,
+                                                         GMimeContentEncoding encoding);
+void                g_mime_encoding_reset               (GMimeEncoding *state);
+size_t              g_mime_encoding_outlen              (GMimeEncoding *state,
+                                                         size_t inlen);
+size_t              g_mime_encoding_step                (GMimeEncoding *state,
+                                                         const char *inbuf,
+                                                         size_t inlen,
+                                                         char *outbuf);
+size_t              g_mime_encoding_flush               (GMimeEncoding *state,
+                                                         const char *inbuf,
+                                                         size_t inlen,
+                                                         char *outbuf);
+#define             GMIME_BASE64_ENCODE_LEN             (x)
+size_t              g_mime_encoding_base64_decode_step  (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+size_t              g_mime_encoding_base64_encode_step  (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+size_t              g_mime_encoding_base64_encode_close (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+#define             GMIME_UUDECODE_STATE_INIT
+#define             GMIME_UUDECODE_STATE_BEGIN
+#define             GMIME_UUDECODE_STATE_END
+#define             GMIME_UUENCODE_LEN                  (x)
+size_t              g_mime_encoding_uudecode_step       (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+size_t              g_mime_encoding_uuencode_step       (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         unsigned char *uubuf,
+                                                         int *state,
+                                                         guint32 *save);
+size_t              g_mime_encoding_uuencode_close      (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         unsigned char *uubuf,
+                                                         int *state,
+                                                         guint32 *save);
+#define             GMIME_QP_ENCODE_LEN                 (x)
+size_t              g_mime_encoding_quoted_decode_step  (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+size_t              g_mime_encoding_quoted_encode_step  (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+size_t              g_mime_encoding_quoted_encode_close (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+
+
+
+

Description

+

+Utility functions to encode or decode MIME +Content-Transfer-Encodings. +

+
+
+

Details

+
+

enum GMimeContentEncoding

+
typedef enum {
+	GMIME_CONTENT_ENCODING_DEFAULT,
+	GMIME_CONTENT_ENCODING_7BIT,
+	GMIME_CONTENT_ENCODING_8BIT,
+	GMIME_CONTENT_ENCODING_BINARY,
+	GMIME_CONTENT_ENCODING_BASE64,
+	GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE,
+	GMIME_CONTENT_ENCODING_UUENCODE
+} GMimeContentEncoding;
+
+

+A Content-Transfer-Encoding enumeration. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

GMIME_CONTENT_ENCODING_DEFAULT

Default transfer encoding. +

GMIME_CONTENT_ENCODING_7BIT

7bit text transfer encoding. +

GMIME_CONTENT_ENCODING_8BIT

8bit text transfer encoding. +

GMIME_CONTENT_ENCODING_BINARY

Binary transfer encoding. +

GMIME_CONTENT_ENCODING_BASE64

Base64 transfer encoding. +

GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE

Quoted-printable transfer encoding. +

GMIME_CONTENT_ENCODING_UUENCODE

Uuencode transfer encoding. +
+
+
+
+

g_mime_content_encoding_from_string ()

+
GMimeContentEncoding g_mime_content_encoding_from_string
+                                                        (const char *str);
+

+Gets the appropriate GMimeContentEncoding enumeration value based +on the input string. +

+
++ + + + + + + + + + +

str :

a string representing a Content-Transfer-Encoding value

Returns :

the GMimeContentEncoding specified by str or +GMIME_CONTENT_ENCODING_DEFAULT on error.
+
+
+
+

g_mime_content_encoding_to_string ()

+
const char *        g_mime_content_encoding_to_string   (GMimeContentEncoding encoding);
+

+Gets the string value of the content encoding. +

+
++ + + + + + + + + + +

encoding :

a GMimeContentEncoding +

Returns :

the encoding type as a string or NULL on error. Available +values for the encoding are: GMIME_CONTENT_ENCODING_DEFAULT, +GMIME_CONTENT_ENCODING_7BIT, GMIME_CONTENT_ENCODING_8BIT, +GMIME_CONTENT_ENCODING_BINARY, GMIME_CONTENT_ENCODING_BASE64, +GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE and +GMIME_CONTENT_ENCODING_UUENCODE.
+
+
+
+

enum GMimeEncodingConstraint

+
typedef enum {
+	GMIME_ENCODING_CONSTRAINT_7BIT,
+	GMIME_ENCODING_CONSTRAINT_8BIT,
+	GMIME_ENCODING_CONSTRAINT_BINARY
+} GMimeEncodingConstraint;
+
+

+Used with functions like g_mime_filter_best_encoding() and +g_mime_object_encode() as the 'constraint' argument. These values +provide a means of letting the filter know what the encoding +constraints are for the stream. +

+
++ + + + + + + + + + + + + + +

GMIME_ENCODING_CONSTRAINT_7BIT

The stream data must fit within the 7bit ASCII range. +

GMIME_ENCODING_CONSTRAINT_8BIT

The stream data may have bytes with the high bit set, but no null bytes. +

GMIME_ENCODING_CONSTRAINT_BINARY

The stream may contain any binary data. +
+
+
+
+

GMimeEncoding

+
typedef struct {
+	GMimeContentEncoding encoding;
+	unsigned char uubuf[60];
+	gboolean encode;
+	guint32 save;
+	int state;
+} GMimeEncoding;
+
+

+A context used for encoding or decoding data. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

GMimeContentEncoding encoding;

the type of encoding

unsigned char uubuf[60];

a temporary buffer needed when uuencoding data

gboolean encode;

+TRUE if encoding or FALSE if decoding

guint32 save;

saved bytes from the previous step

int state;

current encder/decoder state
+
+
+
+

g_mime_encoding_init_encode ()

+
void                g_mime_encoding_init_encode         (GMimeEncoding *state,
+                                                         GMimeContentEncoding encoding);
+

+Initializes a GMimeEncoding state machine for encoding to +encoding. +

+
++ + + + + + + + + + +

state :

a GMimeEncoding to initialize

encoding :

a GMimeContentEncoding to use
+
+
+
+

g_mime_encoding_init_decode ()

+
void                g_mime_encoding_init_decode         (GMimeEncoding *state,
+                                                         GMimeContentEncoding encoding);
+

+Initializes a GMimeEncoding state machine for decoding from +encoding. +

+
++ + + + + + + + + + +

state :

a GMimeEncoding to initialize

encoding :

a GMimeContentEncoding to use
+
+
+
+

g_mime_encoding_reset ()

+
void                g_mime_encoding_reset               (GMimeEncoding *state);
+

+Resets the state of the GMimeEncoding. +

+
++ + + + +

state :

a GMimeEncoding to reset
+
+
+
+

g_mime_encoding_outlen ()

+
size_t              g_mime_encoding_outlen              (GMimeEncoding *state,
+                                                         size_t inlen);
+

+Given the input length, inlen, calculate the needed output length +to perform an encoding or decoding step. +

+
++ + + + + + + + + + + + + + +

state :

a GMimeEncoding +

inlen :

an input length

Returns :

the maximum number of bytes needed to encode or decode a +buffer of inlen bytes.
+
+
+
+

g_mime_encoding_step ()

+
size_t              g_mime_encoding_step                (GMimeEncoding *state,
+                                                         const char *inbuf,
+                                                         size_t inlen,
+                                                         char *outbuf);
+

+Incrementally encodes or decodes (depending on state) an input +stream by 'stepping' through a block of input at a time. +

+

+You should make sure outbuf is large enough by calling +g_mime_encoding_outlen() to find out how large outbuf might need +to be. +

+
++ + + + + + + + + + + + + + + + + + + + + + +

state :

a GMimeEncoding +

inbuf :

an input buffer to encode or decode

inlen :

input buffer length

outbuf :

an output buffer

Returns :

the number of bytes written to outbuf.
+
+
+
+

g_mime_encoding_flush ()

+
size_t              g_mime_encoding_flush               (GMimeEncoding *state,
+                                                         const char *inbuf,
+                                                         size_t inlen,
+                                                         char *outbuf);
+

+Completes the incremental encode or decode of the input stream (see +g_mime_encoding_step() for details). +

+
++ + + + + + + + + + + + + + + + + + + + + + +

state :

a GMimeEncoding +

inbuf :

an input buffer to encode or decode

inlen :

input buffer length

outbuf :

an output buffer

Returns :

the number of bytes written to outbuf.
+
+
+
+

GMIME_BASE64_ENCODE_LEN()

+
#define GMIME_BASE64_ENCODE_LEN(x) ((size_t) (((((x) + 2) / 57) * 77) + 77))
+
+

+Calculates the maximum number of bytes needed to base64 encode the +full input buffer of length x. +

+
++ + + + + + + + + + +

x :

Length of the input data to encode

Returns :

the number of output bytes needed to base64 encode an input +buffer of size x.
+
+
+
+

g_mime_encoding_base64_decode_step ()

+
size_t              g_mime_encoding_base64_decode_step  (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+

+Decodes a chunk of base64 encoded data. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

state :

holds the number of bits that are stored in save +

save :

leftover bits that have not yet been decoded

Returns :

the number of bytes decoded (which have been dumped in +outbuf).
+
+
+
+

g_mime_encoding_base64_encode_step ()

+
size_t              g_mime_encoding_base64_encode_step  (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+

+Base64 encodes a chunk of data. Performs an 'encode step', only +encodes blocks of 3 characters to the output at a time, saves +left-over state in state and save (initialise to 0 on first +invocation). +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

state :

holds the number of bits that are stored in save +

save :

leftover bits that have not yet been encoded

Returns :

the number of bytes encoded.
+
+
+
+

g_mime_encoding_base64_encode_close ()

+
size_t              g_mime_encoding_base64_encode_close (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+

+Base64 encodes the input stream to the output stream. Call this +when finished encoding data with g_mime_encoding_base64_encode_step() +to flush off the last little bit. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

state :

holds the number of bits that are stored in save +

save :

leftover bits that have not yet been encoded

Returns :

the number of bytes encoded.
+
+
+
+

GMIME_UUDECODE_STATE_INIT

+
#define GMIME_UUDECODE_STATE_INIT   (0)
+
+

+Initial state for the g_mime_encoding_uudecode_step() function. +

+
+
+
+

GMIME_UUDECODE_STATE_BEGIN

+
#define GMIME_UUDECODE_STATE_BEGIN  (1 << 16)
+
+

+State for the g_mime_encoding_uudecode_step() function, denoting that +the 'begin' line has been found. +

+
+
+
+

GMIME_UUDECODE_STATE_END

+
#define GMIME_UUDECODE_STATE_END    (1 << 17)
+
+

+State for the g_mime_encoding_uudecode_step() function, denoting that +the end of the UU encoded block has been found. +

+
+
+
+

GMIME_UUENCODE_LEN()

+
#define GMIME_UUENCODE_LEN(x)      ((size_t) (((((x) + 2) / 45) * 62) + 64))
+
+

+Calculates the maximum number of bytes needed to uuencode the full +input buffer of length x. +

+
++ + + + + + + + + + +

x :

Length of the input data to encode

Returns :

the number of output bytes needed to uuencode an input +buffer of size x.
+
+
+
+

g_mime_encoding_uudecode_step ()

+
size_t              g_mime_encoding_uudecode_step       (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+

+Uudecodes a chunk of data. Performs a 'decode step' on a chunk of +uuencoded data. Assumes the "begin mode filename" line has +been stripped off. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

state :

holds the number of bits that are stored in save +

save :

leftover bits that have not yet been decoded

Returns :

the number of bytes decoded.
+
+
+
+

g_mime_encoding_uuencode_step ()

+
size_t              g_mime_encoding_uuencode_step       (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         unsigned char *uubuf,
+                                                         int *state,
+                                                         guint32 *save);
+

+Uuencodes a chunk of data. Performs an 'encode step', only encodes +blocks of 45 characters to the output at a time, saves left-over +state in uubuf, state and save (initialize to 0 on first +invocation). +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output stream

uubuf :

temporary buffer of 60 bytes

state :

holds the number of bits that are stored in save +

save :

leftover bits that have not yet been encoded

Returns :

the number of bytes encoded.
+
+
+
+

g_mime_encoding_uuencode_close ()

+
size_t              g_mime_encoding_uuencode_close      (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         unsigned char *uubuf,
+                                                         int *state,
+                                                         guint32 *save);
+

+Uuencodes a chunk of data. Call this when finished encoding data +with g_mime_encoding_uuencode_step() to flush off the last little bit. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

uubuf :

temporary buffer of 60 bytes

state :

holds the number of bits that are stored in save +

save :

leftover bits that have not yet been encoded

Returns :

the number of bytes encoded.
+
+
+
+

GMIME_QP_ENCODE_LEN()

+
#define GMIME_QP_ENCODE_LEN(x)     ((size_t) ((((x) / 24) * 74) + 74))
+
+

+Calculates the maximum number of bytes needed to encode the full +input buffer of length x using the quoted-printable encoding. +

+
++ + + + + + + + + + +

x :

Length of the input data to encode

Returns :

the number of output bytes needed to encode an input buffer +of size x using the quoted-printable encoding.
+
+
+
+

g_mime_encoding_quoted_decode_step ()

+
size_t              g_mime_encoding_quoted_decode_step  (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+

+Decodes a block of quoted-printable encoded data. Performs a +'decode step' on a chunk of QP encoded data. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

state :

holds the number of bits that are stored in save +

save :

leftover bits that have not yet been decoded

Returns :

the number of bytes decoded.
+
+
+
+

g_mime_encoding_quoted_encode_step ()

+
size_t              g_mime_encoding_quoted_encode_step  (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+

+Quoted-printable encodes a block of text. Performs an 'encode +step', saves left-over state in state and save (initialise to -1 on +first invocation). +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

state :

holds the number of bits that are stored in save +

save :

leftover bits that have not yet been encoded

Returns :

the number of bytes encoded.
+
+
+
+

g_mime_encoding_quoted_encode_close ()

+
size_t              g_mime_encoding_quoted_encode_close (const unsigned char *inbuf,
+                                                         size_t inlen,
+                                                         unsigned char *outbuf,
+                                                         int *state,
+                                                         guint32 *save);
+

+Quoted-printable encodes a block of text. Call this when finished +encoding data with g_mime_encoding_quoted_encode_step() to flush off +the last little bit. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

inbuf :

input buffer

inlen :

input buffer length

outbuf :

output buffer

state :

holds the number of bits that are stored in save +

save :

leftover bits that have not yet been encoded

Returns :

the number of bytes encoded.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-gmime-iconv-utils.html b/docs/reference/html/gmime-gmime-iconv-utils.html new file mode 100644 index 0000000..1bec9fb --- /dev/null +++ b/docs/reference/html/gmime-gmime-iconv-utils.html @@ -0,0 +1,229 @@ + + + + +gmime-iconv-utils + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime-iconv-utils

+

gmime-iconv-utils — High-level routines for converting text from one charset to another

+
+
+

Synopsis

+
char *              g_mime_iconv_strdup                 (iconv_t cd,
+                                                         const char *str);
+char *              g_mime_iconv_strndup                (iconv_t cd,
+                                                         const char *str,
+                                                         size_t n);
+char *              g_mime_iconv_utf8_to_locale         (const char *str);
+char *              g_mime_iconv_utf8_to_locale_length  (const char *str,
+                                                         size_t n);
+char *              g_mime_iconv_locale_to_utf8         (const char *str);
+char *              g_mime_iconv_locale_to_utf8_length  (const char *str,
+                                                         size_t n);
+
+
+
+

Description

+

+Charset conversion utility functions. +

+
+
+

Details

+
+

g_mime_iconv_strdup ()

+
char *              g_mime_iconv_strdup                 (iconv_t cd,
+                                                         const char *str);
+

+Allocates a new string buffer containing str converted to the +destination charset described in cd. +

+
++ + + + + + + + + + + + + + +

cd :

conversion descriptor

str :

string in source charset

Returns :

a new string buffer containing the original string +converted to the new charset.
+
+
+
+

g_mime_iconv_strndup ()

+
char *              g_mime_iconv_strndup                (iconv_t cd,
+                                                         const char *str,
+                                                         size_t n);
+

+Allocates a new string buffer containing the first n bytes of str +converted to the destination charset as described by the conversion +descriptor cd. +

+
++ + + + + + + + + + + + + + + + + + +

cd :

conversion descriptor

str :

string in source charset

n :

number of bytes to convert

Returns :

a new string buffer containing the first n bytes of +str converted to the destination charset as described by the +conversion descriptor cd.
+
+
+
+

g_mime_iconv_utf8_to_locale ()

+
char *              g_mime_iconv_utf8_to_locale         (const char *str);
+

+Allocates a new string buffer containing str converted to the +user's locale charset. +

+
++ + + + + + + + + + +

str :

string in UTF-8 charset

Returns :

a new string buffer containing str converted to the +user's locale charset.
+
+
+
+

g_mime_iconv_utf8_to_locale_length ()

+
char *              g_mime_iconv_utf8_to_locale_length  (const char *str,
+                                                         size_t n);
+

+Allocates a new string buffer containing the first n bytes of +str converted to the user's locale charset. +

+
++ + + + + + + + + + + + + + +

str :

string in UTF-8 charset

n :

number of bytes to convert

Returns :

a new string buffer containing the first n bytes of +str converted to the user's locale charset.
+
+
+
+

g_mime_iconv_locale_to_utf8 ()

+
char *              g_mime_iconv_locale_to_utf8         (const char *str);
+

+Allocates a new string buffer containing str in UTF-8. +

+
++ + + + + + + + + + +

str :

string in locale charset

Returns :

a new string buffer containing str converted to UTF-8.
+
+
+
+

g_mime_iconv_locale_to_utf8_length ()

+
char *              g_mime_iconv_locale_to_utf8_length  (const char *str,
+                                                         size_t n);
+

+Allocates a new string buffer containing the first n bytes of +str converted to UTF-8. +

+
++ + + + + + + + + + + + + + +

str :

string in locale charset

n :

number of bytes to convert

Returns :

a new string buffer containing the first n bytes of +str converted to UTF-8.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-gmime-iconv.html b/docs/reference/html/gmime-gmime-iconv.html new file mode 100644 index 0000000..2a76909 --- /dev/null +++ b/docs/reference/html/gmime-gmime-iconv.html @@ -0,0 +1,258 @@ + + + + +gmime-iconv + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime-iconv

+

gmime-iconv — Low-level routines for converting text from one charset to another

+
+
+

Synopsis

+
void                g_mime_iconv_init                   (void);
+void                g_mime_iconv_shutdown               (void);
+iconv_t             g_mime_iconv_open                   (const char *to,
+                                                         const char *from);
+#define             g_mime_iconv                        (cd,
+                                                         inbuf,
+                                                         inleft,
+                                                         outbuf,
+                                                         outleft)
+int                 g_mime_iconv_close                  (iconv_t cd);
+
+
+
+

Description

+

+These functions are wrappers around the system iconv(3) +routines. The purpose of these wrappers are two-fold: +

+

+1. Cache iconv_t descriptors for you in order to optimize +opening/closing many descriptors frequently +

+

+and +

+

+2. To use the appropriate system charset alias for the MIME charset +names given as arguments. +

+
+
+

Details

+
+

g_mime_iconv_init ()

+
void                g_mime_iconv_init                   (void);
+

+Initialize GMime's iconv cache. This *MUST* be called before any +gmime-iconv interfaces will work correctly. +

+

+Note: this function is called for you by g_mime_init(). +

+
+
+
+

g_mime_iconv_shutdown ()

+
void                g_mime_iconv_shutdown               (void);
+

+Frees internal iconv caches created in g_mime_iconv_init(). +

+

+Note: this function is called for you by g_mime_shutdown(). +

+
+
+
+

g_mime_iconv_open ()

+
iconv_t             g_mime_iconv_open                   (const char *to,
+                                                         const char *from);
+

+Allocates a coversion descriptor suitable for converting byte +sequences from charset from to charset to. The resulting +descriptor can be used with iconv() (or the g_mime_iconv() wrapper) any +number of times until closed using g_mime_iconv_close(). +

+

+See the manual page for iconv_open(3) for further details. +

+
++ + + + + + + + + + + + + + +

to :

charset to convert to

from :

charset to convert from

Returns :

a new conversion descriptor for use with g_mime_iconv() on +success or (iconv_t) -1 on fail as well as setting an appropriate +errno value.
+
+
+
+

g_mime_iconv()

+
#define             g_mime_iconv(cd,inbuf,inleft,outbuf,outleft)
+

+The argument cd must be a conversion descriptor created using the +function g_mime_iconv_open. +

+

+The main case is when inbuf is not NULL and *inbuf is not +NULL. In this case, the g_mime_iconv function converts the +multibyte sequence starting at *inbuf to a multibyte sequence +starting at *outbuf. At most *inleft bytes, starting at *inbuf, +will be read. At most *outleft bytes, starting at *outbuf, will +be written. +

+

+The g_mime_iconv function converts one multibyte character at a +time, and for each character conversion it increments *inbuf and +decrements *inleft by the number of converted input bytes, it +increments *outbuf and decrements *outleft by the number of +converted output bytes, and it updates the conversion state +contained in cd. The conversion can stop for four reasons: +

+

+1. An invalid multibyte sequence is encountered in the input. In +this case it sets errno to EILSEQ and returns (size_t)(-1). +*inbuf is left pointing to the beginning of the invalid multibyte +sequence. +

+

+2. The input byte sequence has been entirely converted, i.e. +*inleft has gone down to 0. In this case g_mime_iconv returns +the number of non-reversible conversions performed during this +call. +

+

+3. An incomplete multibyte sequence is encountered in the input, +and the input byte sequence terminates after it. In this case it +sets errno to EINVAL and returns (size_t)(-1). *inbuf is left +pointing to the beginning of the incomplete multibyte sequence. +

+

+4. The output buffer has no more room for the next converted +character. In this case it sets errno to E2BIG and returns +(size_t)(-1). +

+

+A different case is when inbuf is NULL or *inbuf is NULL, but +outbuf is not NULL and *outbuf is not NULL. In this case, the +g_mime_iconv function attempts to set cd's conversion state to +the initial state and store a corresponding shift sequence at +*outbuf. At most *outleft bytes, starting at *outbuf, will be +written. If the output buffer has no more room for this reset +sequence, it sets errno to E2BIG and returns (size_t)(-1). +Otherwise it increments *outbuf and decrements *outleft by the +number of bytes written. +

+

+A third case is when inbuf is NULL or *inbuf is NULL, and +outbuf is NULL or *outbuf is NULL. In this case, the +g_mime_iconv function sets cd's conversion state to the initial +state. +

+
++ + + + + + + + + + + + + + + + + + + + + + + + + + +

cd :

iconv_t conversion descriptor

inbuf :

input buffer

inleft :

number of bytes left in inbuf +

outbuf :

output buffer

outleft :

number of bytes left in outbuf +

Returns :

the number of characters converted in a nonreversible way +during this call; reversible conversions are not counted. In case +of error, it sets errno and returns (size_t)(-1).
+
+
+
+

g_mime_iconv_close ()

+
int                 g_mime_iconv_close                  (iconv_t cd);
+

+Closes the iconv descriptor cd. +

+

+See the manual page for iconv_close(3) for further details. +

+
++ + + + + + + + + + +

cd :

iconv conversion descriptor

Returns :

+0 on success or -1 on fail as well as setting an +appropriate errno value.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-gmime-utils.html b/docs/reference/html/gmime-gmime-utils.html new file mode 100644 index 0000000..30607e7 --- /dev/null +++ b/docs/reference/html/gmime-gmime-utils.html @@ -0,0 +1,642 @@ + + + + +gmime-utils + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime-utils

+

gmime-utils — MIME utility functions

+
+
+

Synopsis

+
struct              GMimeReferences;
+time_t              g_mime_utils_header_decode_date     (const char *str,
+                                                         int *tz_offset);
+char *              g_mime_utils_header_format_date     (time_t date,
+                                                         int tz_offset);
+char *              g_mime_utils_generate_message_id    (const char *fqdn);
+char *              g_mime_utils_decode_message_id      (const char *message_id);
+const char *        g_mime_references_get_message_id    (const GMimeReferences *ref);
+const GMimeReferences * g_mime_references_get_next      (const GMimeReferences *ref);
+GMimeReferences *   g_mime_references_decode            (const char *text);
+void                g_mime_references_append            (GMimeReferences **refs,
+                                                         const char *msgid);
+void                g_mime_references_clear             (GMimeReferences **refs);
+void                g_mime_references_free              (GMimeReferences *refs);
+char *              g_mime_utils_header_fold            (const char *str);
+char *              g_mime_utils_header_printf          (const char *format,
+                                                         ...);
+char *              g_mime_utils_quote_string           (const char *str);
+void                g_mime_utils_unquote_string         (char *str);
+gboolean            g_mime_utils_text_is_8bit           (const unsigned char *text,
+                                                         size_t len);
+GMimeContentEncoding g_mime_utils_best_encoding         (const unsigned char *text,
+                                                         size_t len);
+char *              g_mime_utils_decode_8bit            (const char *text,
+                                                         size_t len);
+char *              g_mime_utils_header_decode_text     (const char *text);
+char *              g_mime_utils_header_encode_text     (const char *text);
+char *              g_mime_utils_header_decode_phrase   (const char *phrase);
+char *              g_mime_utils_header_encode_phrase   (const char *phrase);
+char *              g_mime_utils_structured_header_fold (const char *str);
+char *              g_mime_utils_unstructured_header_fold
+                                                        (const char *str);
+
+
+
+

Description

+

+Utility functions to parse, encode and decode various MIME tokens +and encodings. +

+
+
+

Details

+
+

struct GMimeReferences

+
struct GMimeReferences {
+	GMimeReferences *next;
+	char *msgid;
+};
+
+

+A List of references, as per the References or In-Reply-To header +fields. +

+
++ + + + + + + + + + +

GMimeReferences *next;

Pointer to the next reference.

char *msgid;

Reference message-id.
+
+
+
+

g_mime_utils_header_decode_date ()

+
time_t              g_mime_utils_header_decode_date     (const char *str,
+                                                         int *tz_offset);
+

+Decodes the rfc822 date string and saves the GMT offset into +tz_offset if non-NULL. +

+
++ + + + + + + + + + + + + + +

str :

input date string

tz_offset :

timezone offset

Returns :

the time_t representation of the date string specified by +str or (time_t) 0 on error. If tz_offset is non-NULL, the value +of the timezone offset will be stored.
+
+
+
+

g_mime_utils_header_format_date ()

+
char *              g_mime_utils_header_format_date     (time_t date,
+                                                         int tz_offset);
+

+Allocates a string buffer containing the rfc822 formatted date +string represented by time and tz_offset. +

+
++ + + + + + + + + + + + + + +

date :

time_t date representation

tz_offset :

Timezone offset

Returns :

a valid string representation of the date.
+
+
+
+

g_mime_utils_generate_message_id ()

+
char *              g_mime_utils_generate_message_id    (const char *fqdn);
+

+Generates a unique Message-Id. +

+
++ + + + + + + + + + +

fqdn :

Fully qualified domain name

Returns :

a unique string in an addr-spec format suitable for use as +a Message-Id.
+
+
+
+

g_mime_utils_decode_message_id ()

+
char *              g_mime_utils_decode_message_id      (const char *message_id);
+

+Decodes a msg-id as defined by rfc822. +

+
++ + + + + + + + + + +

message_id :

string containing a message-id

Returns :

the addr-spec portion of the msg-id.
+
+
+
+

g_mime_references_get_message_id ()

+
const char *        g_mime_references_get_message_id    (const GMimeReferences *ref);
+

+Gets the Message-Id reference from the GMimeReferences node. +

+
++ + + + + + + + + + +

ref :

a GMimeReferences list

Returns :

the Message-Id reference from the GMimeReferences node.
+
+
+
+

g_mime_references_get_next ()

+
const GMimeReferences * g_mime_references_get_next      (const GMimeReferences *ref);
+

+Advances to the next reference node in the GMimeReferences list. +

+
++ + + + + + + + + + +

ref :

a GMimeReferences list

Returns :

the next reference node in the GMimeReferences list.
+
+
+
+

g_mime_references_decode ()

+
GMimeReferences *   g_mime_references_decode            (const char *text);
+

+Decodes a list of msg-ids as in the References and/or In-Reply-To +headers defined in rfc822. +

+
++ + + + + + + + + + +

text :

string containing a list of msg-ids

Returns :

a list of referenced msg-ids.
+
+
+
+

g_mime_references_append ()

+
void                g_mime_references_append            (GMimeReferences **refs,
+                                                         const char *msgid);
+

+Appends a reference to msgid to the list of references. +

+
++ + + + + + + + + + +

refs :

the address of a GMimeReferences list

msgid :

a message-id string
+
+
+
+

g_mime_references_clear ()

+
void                g_mime_references_clear             (GMimeReferences **refs);
+

+Clears the GMimeReferences list and resets it to NULL. +

+
++ + + + +

refs :

address of a GMimeReferences list
+
+
+
+

g_mime_references_free ()

+
void                g_mime_references_free              (GMimeReferences *refs);
+

+Frees the GMimeReferences list. +

+
++ + + + +

refs :

a GMimeReferences list
+
+
+
+

g_mime_utils_header_fold ()

+
char *              g_mime_utils_header_fold            (const char *str);
+

+Folds a structured header according to the rules in rfc822. +

+
++ + + + + + + + + + +

str :

input string

Returns :

an allocated string containing the folded header.
+
+
+
+

g_mime_utils_header_printf ()

+
char *              g_mime_utils_header_printf          (const char *format,
+                                                         ...);
+

+Allocates a buffer containing a formatted header specified by the +Varargs. +

+
++ + + + + + + + + + +

format :

string format

Returns :

an allocated string containing the folded header specified +by format and the following arguments.
+
+
+
+

g_mime_utils_quote_string ()

+
char *              g_mime_utils_quote_string           (const char *str);
+

+Quotes string as needed according to the rules in rfc2045. +

+
++ + + + + + + + + + +

str :

input string

Returns :

an allocated string containing the escaped and quoted (if +needed to be) input string. The decision to quote the string is +based on whether or not the input string contains any 'tspecials' +as defined by rfc2045.
+
+
+
+

g_mime_utils_unquote_string ()

+
void                g_mime_utils_unquote_string         (char *str);
+

+Unquotes and unescapes a string. +

+
++ + + + +

str :

input string
+
+
+
+

g_mime_utils_text_is_8bit ()

+
gboolean            g_mime_utils_text_is_8bit           (const unsigned char *text,
+                                                         size_t len);
+

+Determines if text contains 8bit characters within the first len +bytes. +

+
++ + + + + + + + + + + + + + +

text :

text to check for 8bit chars

len :

text length

Returns :

+TRUE if the text contains 8bit characters or FALSE +otherwise.
+
+
+
+

g_mime_utils_best_encoding ()

+
GMimeContentEncoding g_mime_utils_best_encoding         (const unsigned char *text,
+                                                         size_t len);
+

+Determines the best content encoding for the first len bytes of +text. +

+
++ + + + + + + + + + + + + + +

text :

text to encode

len :

text length

Returns :

a GMimeContentEncoding that is determined to be the best +encoding type for the specified block of text. ("best" in this +particular case means smallest output size)
+
+
+
+

g_mime_utils_decode_8bit ()

+
char *              g_mime_utils_decode_8bit            (const char *text,
+                                                         size_t len);
+

+Attempts to convert text in an unknown 8bit/multibyte charset into +UTF-8 by finding the charset which will convert the most bytes into +valid UTF-8 characters as possible. If no exact match can be found, +it will choose the best match and convert invalid byte sequences +into question-marks (?) in the returned string buffer. +

+
++ + + + + + + + + + + + + + +

text :

input text in unknown 8bit/multibyte character set

len :

input text length

Returns :

a UTF-8 string representation of text.
+
+
+
+

g_mime_utils_header_decode_text ()

+
char *              g_mime_utils_header_decode_text     (const char *text);
+

+Decodes an rfc2047 encoded 'text' header. +

+

+Note: See g_mime_set_user_charsets() for details on how charset +conversion is handled for unencoded 8bit text and/or wrongly +specified rfc2047 encoded-word tokens. +

+
++ + + + + + + + + + +

text :

header text to decode

Returns :

a newly allocated UTF-8 string representing the the decoded +header.
+
+
+
+

g_mime_utils_header_encode_text ()

+
char *              g_mime_utils_header_encode_text     (const char *text);
+

+Encodes a 'text' header according to the rules in rfc2047. +

+
++ + + + + + + + + + +

text :

text to encode

Returns :

the encoded header. Useful for encoding +headers like "Subject".
+
+
+
+

g_mime_utils_header_decode_phrase ()

+
char *              g_mime_utils_header_decode_phrase   (const char *phrase);
+

+Decodes an rfc2047 encoded 'phrase' header. +

+

+Note: See g_mime_set_user_charsets() for details on how charset +conversion is handled for unencoded 8bit text and/or wrongly +specified rfc2047 encoded-word tokens. +

+
++ + + + + + + + + + +

phrase :

header to decode

Returns :

a newly allocated UTF-8 string representing the the decoded +header.
+
+
+
+

g_mime_utils_header_encode_phrase ()

+
char *              g_mime_utils_header_encode_phrase   (const char *phrase);
+

+Encodes a 'phrase' header according to the rules in rfc2047. +

+
++ + + + + + + + + + +

phrase :

phrase to encode

Returns :

the encoded 'phrase'. Useful for encoding internet +addresses.
+
+
+
+

g_mime_utils_structured_header_fold ()

+
char *              g_mime_utils_structured_header_fold (const char *str);
+

+Folds a structured header according to the rules in rfc822. +

+
++ + + + + + + + + + +

str :

input string

Returns :

an allocated string containing the folded header.
+
+
+
+

g_mime_utils_unstructured_header_fold ()

+
char *              g_mime_utils_unstructured_header_fold
+                                                        (const char *str);
+

+Folds an unstructured header according to the rules in rfc822. +

+
++ + + + + + + + + + +

str :

input string

Returns :

an allocated string containing the folded header.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-gmime.html b/docs/reference/html/gmime-gmime.html new file mode 100644 index 0000000..f354443 --- /dev/null +++ b/docs/reference/html/gmime-gmime.html @@ -0,0 +1,261 @@ + + + + +gmime + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+

gmime

+

gmime — Initialization, shutdown and version-check routines

+
+
+

Synopsis

+
#define             GMIME_MAJOR_VERSION
+#define             GMIME_MICRO_VERSION
+#define             GMIME_MINOR_VERSION
+#define             GMIME_BINARY_AGE
+#define             GMIME_INTERFACE_AGE
+#define             GMIME_CHECK_VERSION                 (major,
+                                                         minor,
+                                                         micro)
+#define             GMIME_ENABLE_RFC2047_WORKAROUNDS
+void                g_mime_init                         (guint32 flags);
+void                g_mime_shutdown                     (void);
+extern const guint  gmime_major_version;
+extern const guint  gmime_minor_version;
+extern const guint  gmime_micro_version;
+extern const guint  gmime_binary_age;
+extern const guint  gmime_interface_age;
+gboolean            g_mime_check_version                (guint major,
+                                                         guint minor,
+                                                         guint micro);
+
+
+
+

Description

+

+Initialization, shutdown, and version-check functions. +

+
+
+

Details

+
+

GMIME_MAJOR_VERSION

+
#define GMIME_MAJOR_VERSION (2)
+
+

+GMime's major version. +

+
+
+
+

GMIME_MICRO_VERSION

+
#define GMIME_MICRO_VERSION (15)
+
+

+GMime's micro version. +

+
+
+
+

GMIME_MINOR_VERSION

+
#define GMIME_MINOR_VERSION (6)
+
+

+GMime's minor version. +

+
+
+
+

GMIME_BINARY_AGE

+
#define GMIME_BINARY_AGE    (615)
+
+

+GMime's binary age. +

+
+
+
+

GMIME_INTERFACE_AGE

+
#define GMIME_INTERFACE_AGE (15)
+
+

+GMime's interface age. +

+
+
+
+

GMIME_CHECK_VERSION()

+
#define             GMIME_CHECK_VERSION(major,minor,micro)
+

+Check whether a GMime version equal to or greater than +major.minor.micro is present. +

+
++ + + + + + + + + + + + + + +

major :

Minimum major version

minor :

Minimum minor version

micro :

Minimum micro version
+
+
+
+

GMIME_ENABLE_RFC2047_WORKAROUNDS

+
#define GMIME_ENABLE_RFC2047_WORKAROUNDS  (1 << 0)
+
+

+Initialization flag to enable workarounds for badly formed rfc2047 +encoded-words. +

+
+
+
+

g_mime_init ()

+
void                g_mime_init                         (guint32 flags);
+

+Initializes GMime. +

+

+Note: Calls g_mime_charset_map_init() and g_mime_iconv_init() as +well. +

+
++ + + + +

flags :

initialization flags
+
+
+
+

g_mime_shutdown ()

+
void                g_mime_shutdown                     (void);
+

+Frees internally allocated tables created in g_mime_init(). Also +calls g_mime_charset_map_shutdown() and g_mime_iconv_shutdown(). +

+
+
+
+

gmime_major_version

+
extern const guint gmime_major_version;
+
+

+GMime's major version. +

+
+
+
+

gmime_minor_version

+
extern const guint gmime_minor_version;
+
+

+GMime's minor version. +

+
+
+
+

gmime_micro_version

+
extern const guint gmime_micro_version;
+
+

+GMime's micro version. +

+
+
+
+

gmime_binary_age

+
extern const guint gmime_binary_age;
+
+

+GMime's binary age. +

+
+
+
+

gmime_interface_age

+
extern const guint gmime_interface_age;
+
+

+GMime's interface age. +

+
+
+
+

g_mime_check_version ()

+
gboolean            g_mime_check_version                (guint major,
+                                                         guint minor,
+                                                         guint micro);
+

+Checks that the GMime library version meets the requirements of the +required version. +

+
++ + + + + + + + + + + + + + + + + + +

major :

Minimum major version

minor :

Minimum minor version

micro :

Minimum micro version

Returns :

+TRUE if the requirement is met or FALSE otherwise.
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-question-index.html b/docs/reference/html/gmime-question-index.html new file mode 100644 index 0000000..4c198ed --- /dev/null +++ b/docs/reference/html/gmime-question-index.html @@ -0,0 +1,132 @@ + + + + +Frequently Asked Questions + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Frequently Asked Questions

+

Frequently Asked Questions — +Find answers to common questions in the GMime manual +

+
+
+

Questions and Answers

+

This is an "index" of the reference manual + organized by common "How do I..." questions. If you + aren't sure which documentation to read for the question you have, + this list is a good place to start. +

+
+ +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+1. General
+

1.1.

+

Where can I get help with GMime, submit a bug report, or make a feature request?

See the documentation on this + topic.

+

1.2.

+

How do I port from one GMime version to another?

See the list of + incompatible changes from 2.2 to 2.4.

+

1.3.

+

How does memory management work in GMime? Should I free data returned from functions?

+

Most accessor functions return a pointer to internal + members. When these internal members are objects + themselves (e.g. subclasses + of GObject), + there is no need to unref them unless otherwise stated in + the documentation for that particular function.

+

For accessor functions that return strings, they will be + declared "const" if they should not be freed. Non-const + strings should be freed with g_free().

+
+

1.4.

+

How do I use GMime with threads?

+

First, read the GThread documentation for + portable threading primitives.

+

Secondly, all functions + in gmime-charset, gmime-iconv + and gmime-utils should + be thread-safe. Objects subclassing + GObject + are not. This means that you'll have to do your own mutex + locking if you want to access the same GObjects from + multiple threads. +

+
+

1.5.

+

How do I use GMime with C++?

The GMime header files use the subset of C that's + also valid C++, so you can simply use the normal GMime API + in a C++ program.

+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-resources.html b/docs/reference/html/gmime-resources.html new file mode 100644 index 0000000..fe05221 --- /dev/null +++ b/docs/reference/html/gmime-resources.html @@ -0,0 +1,82 @@ + + + + +Mailing lists and bug reports + + + + + + + + + + + + + + + + +
+
+
+ + +
+

Mailing lists and bug reports

+

Mailing lists and bug reports — +Getting help with GMime +

+
+
+

Filing a bug report or feature request

+

+If you encounter a bug, misfeature, or missing feature in GMime, please +file a bug report at +http://bugzilla.gnome.org. +We'd also appreciate reports of incomplete or misleading information in +the GMime documentation; file those against the "docs" component of the +"gmime" product in Bugzilla. +

+

+The bug tracker should definitely be used for feature requests, it's +not only for bugs. We track all GMime development in Bugzilla, so it's +the way to be sure the GMime developers won't forget about an issue. +

+
+
+

Submitting Patches

+

+If you develop a bugfix or enhancement for GMime, please file that in +Bugzilla as well. Bugzilla allows you to attach files; please attach a +patch generated by the diff utility, using the +-u option to make the patch more readable. All +patches must be offered under the terms of +the LGPLv2.1 +license, so be sure you are authorized to give us the patch under +those terms. +

+

+If you want to discuss your patch before or after developing it, mail +gmime-devel-list@gnome.org, +but be sure to file +the Bugzilla report as +well, this way it's less likely to slip through the cracks. +

+
+
+

Mailing lists

+

There is currently only one mailing-list devoted to GMime + itself which is for both the development of and development with + GMime. You can subscribe to this list + at http://mail.gnome.org/mailman/listinfo/gmime-devel-list. +

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime-streams.html b/docs/reference/html/gmime-streams.html new file mode 100644 index 0000000..fabe368 --- /dev/null +++ b/docs/reference/html/gmime-streams.html @@ -0,0 +1,90 @@ + + + + +GMime Streams + + + + + + + + + + + + + + + + +
+
+
+ + +
+

GMime Streams

+

GMime Streams — How to use GMime Streams

+
+
+

Overview of Streams

+

Streams are the fundamental method for reading and writing + data used by GMime. You'll probably notice that the basic API is + similar to that of the low-level Unix I/O layer (read(), write(), + lseek(), etc) with some additional nicities such as a printf-like + function.

+

The three (3) basic stream types are: GMimeStreamFile, + GMimeStreamFs and GMimeStreamMem. You can manipulate all three + streams using the GMimeStream interfaces. In addition, some of + these streams have extended interfaces to allow more fine grained + manipulation.

+

GMimeStreamFile and GMimeStreamFs are very similar in that + they are both meant for reading and writing data to the file + system (in the form of files). Since GMimeStreamFile is an + abstracted layer above the standard libc FILE type, one of the + added benefits is buffered I/O. GMimeStreamFs, on the other hand, + is an abstracted layer above Unix file descriptors. While a + GMimeStreamFs can be used on top of a UNIX socket or pipe, you + must be careful because sockets and pipes are not seekable.

+

Unlike the previous 2 stream types, GMimeStreamMem does not + interact with the file system at all (except maybe the swap + partition/file indirectly). Memory streams are handy when you want + reads and writes to be nearly instantaneous and/or if you don't + want to create a temporary file on disk.

+

The four (4) advanced stream types are GMimeStreamMmap, + GMimeStreamNull, GMimeStreamBuffer and GMimeStreamFilter.

+

Our most simple stream, GMimeStreamNull, is the stream + equivalent of /dev/null on Unix systems. The main difference is + that GMimeStreamNull records the number of bytes written to it - + you may find this useful if you need to know the number of bytes a + GMimeObject (for example) will require.

+

GMimeStreamMmap is a memory-mapped stream. This isn't + guarenteed to work on all systems since not all systems support + the POSIX mmap system call, but for those that do - this might + present a faster stream than GMimeStreamFs and/or + GMimeStreamFile. You'll have to do some experimentation to know + for sure.

+

The GMimeStreamBuffer can be used on top of any other type + of stream and has 3 modes: block reads, block writes, and cached + reads. Block reads are especially useful if you will be making a + lot of small reads from a stream that accesses the file + system. Block writes are useful for very much the same reason. The + final mode, cached reads, can become memory intensive but can be + very helpful when inheriting from a stream that does not support + seeking (Note: this mode is the least tested so be careful using + it).

+

Our final stream type, GMimeStreamFilter, can also be used + on top of another stream. This stream, as you may have guessed, + filters reads and writes to its inherited stream. For example, one + could write a compression filter and apply it to a + GMimeStreamFilter and any further reads or writes would be + (un)compressed.

+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/gmime.devhelp2 b/docs/reference/html/gmime.devhelp2 new file mode 100644 index 0000000..64e4687 --- /dev/null +++ b/docs/reference/html/gmime.devhelp2 @@ -0,0 +1,738 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/html/gmime.html b/docs/reference/html/gmime.html new file mode 100644 index 0000000..4da04f5 --- /dev/null +++ b/docs/reference/html/gmime.html @@ -0,0 +1,93 @@ + + + + +Part I. GMime Overview + + + + + + + + + + + + + + + + +
+

+Part I. GMime Overview

+
+
+

+GMime is a powerful MIME (Multipurpose Internet Mail Extension) +utility library. It is meant for creating, editing, and parsing MIME +messages and structures. GMime is released under the 2.1 version of +the GNU Lesser General Public License. GMime is based on GLib 2.0's +GObject system allowing for a lot of flexibility. +

+

+GMime depends on the following libraries: +

+
++ + + + +

GLib

+A general-purpose utility library, not specific to graphical user interfaces. +GLib provides many useful data types, macros, type conversions, +string utilities, file utilities, a main loop abstraction, and so on. +

+

+

+
+

Table of Contents

+
+
+Compiling the GMime libraries — How to compile GMime itself +
+
+Compiling GMime Applications — +How to compile your GMime application + +
+
+Changes from 1.0 to 2.0 — +Incompatible changes made between version 1.0 and version 2.0 + +
+
+Changes from 2.0 to 2.2 — Incompatible changes made between version 2.0 and version 2.2 +
+
+Changes from 2.2 to 2.4 — Changes made between version 2.2 and version 2.4 +
+
+Changes from 2.4 to 2.6 — Changes made between version 2.4 and version 2.6 +
+
+Mailing lists and bug reports — +Getting help with GMime + +
+
+Frequently Asked Questions — +Find answers to common questions in the GMime manual + +
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/home.png b/docs/reference/html/home.png new file mode 100644 index 0000000000000000000000000000000000000000..fb60b552ed4965b293039b2f814a71afca95e90c GIT binary patch literal 578 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAeF*RgaRt)<2Mz#jXJKLC;Nall z;SmuLk&uv3P*6}&QPI%Q(9zK`Ffg#Nu&}YQad2?(_xBG72#Ai3j*pK|NJz-Z$*Hcc zZfI!e?(SZ^c=7u6>-X>9fB5j>l-IX+&z`?}`|kaRPoKYh z`~LIypTGZ3G@p47sO!3?i(^Q|t+nT)!&fY+K7It<8`5*2;fuxNO3aRMvTDwK$8R_2G`Mj{ z^E<0ac3!wQQzE%;MdAv<`$uXnv9`S09_8~rhEee)yK`rlo5QUMbwDpNc)I$ztaD0e F0s!lvLUI5A literal 0 HcmV?d00001 diff --git a/docs/reference/html/index.html b/docs/reference/html/index.html new file mode 100644 index 0000000..c3da4ad --- /dev/null +++ b/docs/reference/html/index.html @@ -0,0 +1,296 @@ + + + + +GMime 2.6 Reference Manual + + + + + + + + +
+
+
+
+
+

+Jeffrey Stedfast +

+


+            
+          

+
+
+
+

+ This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. +

+

+ You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +

+
+
+

Abstract

+

This manual documents the interfaces of the GMime + library and has some short notes to help get you up to speed + with using the library.

+
+
+
+
+
+
I. GMime Overview
+
+
+Compiling the GMime libraries — How to compile GMime itself +
+
+Compiling GMime Applications — +How to compile your GMime application + +
+
+Changes from 1.0 to 2.0 — +Incompatible changes made between version 1.0 and version 2.0 + +
+
+Changes from 2.0 to 2.2 — Incompatible changes made between version 2.0 and version 2.2 +
+
+Changes from 2.2 to 2.4 — Changes made between version 2.2 and version 2.4 +
+
+Changes from 2.4 to 2.6 — Changes made between version 2.4 and version 2.6 +
+
+Mailing lists and bug reports — +Getting help with GMime + +
+
+Frequently Asked Questions — +Find answers to common questions in the GMime manual + +
+
+
II. GMime Fundamentals
+
+
+GMime Streams — How to use GMime Streams +
+
+GMime Stream Filters — How to use GMime Stream Filters +
+
+GMime Data Wrappers — How to use GMime Data Wrappers +
+
+
III. GMime Core Reference
+
+
+gmime — Initialization, shutdown and version-check routines +
+
+gmime-charset — Charset helper functions +
+
+gmime-iconv — Low-level routines for converting text from one charset to another +
+
+gmime-iconv-utils — High-level routines for converting text from one charset to another +
+
+gmime-encodings — MIME encoding functions +
+
+gmime-utils — MIME utility functions +
+
+
IV. GMime Classes
+
+
Class hierarchy
+
Streams
+
+
+GMimeStream — Abstract stream class +
+
+GMimeStreamFile — A Standard-C FILE-based stream +
+
+GMimeStreamFs — A low-level FileSystem stream +
+
+GMimeStreamMem — A memory-backed stream +
+
+GMimeStreamMmap — A memory-mapped file stream +
+
+GMimeStreamNull — A null stream +
+
+GMimeStreamFilter — A filtering stream +
+
+GMimeStreamBuffer — A buffered stream +
+
+GMimeStreamPipe — A low-level pipe stream +
+
+GMimeStreamCat — A concatenated stream +
+
+
Stream Filters
+
+
+GMimeFilter — Abstract filter class +
+
+GMimeFilterBasic — Basic transfer encoding filter +
+
+GMimeFilterBest — Determine the best charset/encoding to use for a stream +
+
+GMimeFilterCharset — Charset-conversion filter +
+
+GMimeFilterCRLF — Convert line-endings from LF to CRLF or vise versa +
+
+GMimeFilterEnriched — Convert text/enriched or text/rtf to HTML +
+
+GMimeFilterFrom — Escape MBox From_ lines +
+
+GMimeFilterGZip — GNU Zip compression/decompression +
+
+GMimeFilterHTML — Convert plain text into HTML +
+
+GMimeFilterMd5 — Calculate an md5sum +
+
+GMimeFilterStrip — Strip trailing whitespace from the end of lines +
+
+GMimeFilterWindows — Determine if text is in a Microsoft Windows codepage +
+
+GMimeFilterYenc — yEncode or yDecode +
+
+
Data Wrappers
+
+GMimeDataWrapper — Content objects +
+
Message and MIME Headers
+
+
+GMimeHeader — Message and MIME part headers +
+
+GMimeContentType — Content-Type fields +
+
+GMimeContentDisposition — Content-Disposition fields +
+
+GMimeParam — Content-Type and Content-Disposition parameters +
+
+
Internet Addresses
+
+
+InternetAddress — Internet addresses +
+
+InternetAddressGroup — rfc822 'group' address +
+
+InternetAddressMailbox — rfc822 'mailbox' address +
+
+InternetAddressList — A list of internet addresses +
+
+
MIME Messages and Parts
+
+
+GMimeObject — Abstract MIME objects +
+
+GMimeMessage — Messages +
+
+GMimePart — MIME parts +
+
+GMimeMultipart — MIME multiparts +
+
+GMimeMultipartEncrypted — Encrypted MIME multiparts +
+
+GMimeMultipartSigned — Signed MIME multiparts +
+
+GMimeMessagePart — Message parts +
+
+GMimeMessagePartial — Partial MIME parts +
+
+GMimePartIter — MIME part iterators +
+
+
Parsing Messages and MIME Parts
+
+GMimeParser — Message and MIME part parser +
+
Cryptography Contexts
+
+
+GMimeCertificate — Digital certificates +
+
+GMimeSignature — Digital signatures +
+
+GMimeCryptoContext — Encryption/signing contexts +
+
+GMimeGpgContext — GnuPG crypto contexts +
+
+GMimePkcs7Context — PKCS7 crypto contexts +
+
+
+
+
+ + + \ No newline at end of file diff --git a/docs/reference/html/index.sgml b/docs/reference/html/index.sgml new file mode 100644 index 0000000..1b70661 --- /dev/null +++ b/docs/reference/html/index.sgml @@ -0,0 +1,949 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/html/left.png b/docs/reference/html/left.png new file mode 100644 index 0000000000000000000000000000000000000000..48cab276723733c79792bf270990592938a46e1f GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaA)dl#3xB}__)B_+ZBqTI6G_0+y z9UL4Q8XB6Lo0l(Ne*OCO`}glZe*F0P^XIQ$zyAFB^Y7okf!3B;efk5`BUKXQ7tFxI zBOsw-U}EEukX}$--`zib{^He#Z{Pp?dtyH?D^OLBr;B4q#jV^+H-(xE1Y9l_Iu;z4 zZR+ak`upELn{z+1{HV^C3RAUx`dg(vwnTdruGcuhx4p|L{wTx5ZYPx&X4B#s`RabR uK2tDo4+%_Il(5uMF~;EeeHHIRk9osW6@K4xn;Q#s7lWs(pUXO@geCwjBg*ao literal 0 HcmV?d00001 diff --git a/docs/reference/html/right.png b/docs/reference/html/right.png new file mode 100644 index 0000000000000000000000000000000000000000..ed55207f1724d878d7f34739df09bc691de6ba5d GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaARR{QlxB}__)B`}%SXfv%I5>EC zcoY;Al$DjWwY41_99FMhy?_7y!-o$aKYslD`Sb7JzX#g+Jp2n#J%dz9kY6wZ2akY= zgp7uXg@b!U^y=;V51+q${r=xGkihYWaF0)nSGL_~4v zsy0qpoBHoRx91b)PML#uY~Cl_6iIcwxhCq(b4!hn#|+g)^Yq0S-!v7Ec$2?7@@M^iZG`mTh716h@d}lb{2iURkP+kX3j17wd>EmBX&=u zvv*uDf3%l(&U^nZl`l8v@kwm9&20<|)bsLR{F2#{Ut#yhsr;NEk9fNJxvX C=EM*H literal 0 HcmV?d00001 diff --git a/docs/reference/html/style.css b/docs/reference/html/style.css new file mode 100644 index 0000000..d6f6c26 --- /dev/null +++ b/docs/reference/html/style.css @@ -0,0 +1,266 @@ +.synopsis, .classsynopsis +{ + /* tango:aluminium 1/2 */ + background: #eeeeec; + border: solid 1px #d3d7cf; + padding: 0.5em; +} +.programlisting +{ + /* tango:sky blue 0/1 */ + background: #e6f3ff; + border: solid 1px #729fcf; + padding: 0.5em; +} +.variablelist +{ + padding: 4px; + margin-left: 3em; +} +.variablelist td:first-child +{ + vertical-align: top; +} + +@media screen { + sup a.footnote + { + position: relative; + top: 0em ! important; + + } + /* this is needed so that the local anchors are displayed below the naviagtion */ + div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] + { + display: inline-block; + position: relative; + top:-5em; + } + /* this seems to be a bug in the xsl style sheets when generating indexes */ + div.index div.index + { + top: 0em; + } + /* make space for the fixed navigation bar and add space at the bottom so that + * link targets appear somewhat close to top + */ + body + { + padding-top: 3.2em; + padding-bottom: 20em; + } + /* style and size the navigation bar */ + table.navigation#top + { + position: fixed; + /* tango:scarlet red 0/1 */ + background: #ffe6e6; + border: solid 1px #ef2929; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + z-index: 10; + } + .navigation a, .navigation a:visited + { + /* tango:scarlet red 3 */ + color: #a40000; + } + .navigation a:hover + { + /* tango:scarlet red 1 */ + color: #ef2929; + } + td.shortcuts + { + /* tango:scarlet red 1 */ + color: #ef2929; + font-size: 80%; + white-space: nowrap; + } +} +@media print { + table.navigation { + visibility: collapse; + display: none; + } + div.titlepage table.navigation { + visibility: visible; + display: table; + /* tango:scarlet red 0/1 */ + background: #ffe6e6; + border: solid 1px #ef2929; + margin-top: 0; + margin-bottom: 0; + top: 0; + left: 0; + height: 3em; + } +} + +.navigation .title +{ + font-size: 200%; +} + +div.gallery-float +{ + float: left; + padding: 10px; +} +div.gallery-float img +{ + border-style: none; +} +div.gallery-spacer +{ + clear: both; +} + +a, a:visited +{ + text-decoration: none; + /* tango:sky blue 2 */ + color: #3465a4; +} +a:hover +{ + text-decoration: underline; + /* tango:sky blue 1 */ + color: #729fcf; +} + +div.table table +{ + border-collapse: collapse; + border-spacing: 0px; + /* tango:aluminium 3 */ + border: solid 1px #babdb6; +} + +div.table table td, div.table table th +{ + /* tango:aluminium 3 */ + border: solid 1px #babdb6; + padding: 3px; + vertical-align: top; +} + +div.table table th +{ + /* tango:aluminium 2 */ + background-color: #d3d7cf; +} + +hr +{ + /* tango:aluminium 3 */ + color: #babdb6; + background: #babdb6; + border: none 0px; + height: 1px; + clear: both; +} + +.footer +{ + padding-top: 3.5em; + /* tango:aluminium 3 */ + color: #babdb6; + text-align: center; + font-size: 80%; +} + +.warning +{ + /* tango:orange 0/1 */ + background: #ffeed9; + border-color: #ffb04f; +} +.note +{ + /* tango:chameleon 0/0.5 */ + background: #d8ffb2; + border-color: #abf562; +} +.note, .warning +{ + padding: 0.5em; + border-width: 1px; + border-style: solid; +} +.note h3, .warning h3 +{ + margin-top: 0.0em +} +.note p, .warning p +{ + margin-bottom: 0.0em +} + +/* blob links */ +h2 .extralinks, h3 .extralinks +{ + float: right; + /* tango:aluminium 3 */ + color: #babdb6; + font-size: 80%; + font-weight: normal; +} + +.annotation +{ + /* tango:aluminium 5 */ + color: #555753; + font-size: 80%; + font-weight: normal; +} + +/* code listings */ + +.listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ +.listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ +.listing_code .programlisting .function { color: #000000; font-weight: bold; } +.listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ +.listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ +.listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ +.listing_code .programlisting .normal { color: #000000; } +.listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ +.listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ +.listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ +.listing_code .programlisting .type { color: #000000; } +.listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ +.listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ + +.listing_frame { + /* tango:sky blue 1 */ + border: solid 1px #729fcf; + padding: 0px; +} + +.listing_lines, .listing_code { + margin-top: 0px; + margin-bottom: 0px; + padding: 0.5em; +} +.listing_lines { + /* tango:sky blue 0.5 */ + background: #a6c5e3; + /* tango:aluminium 6 */ + color: #2e3436; +} +.listing_code { + /* tango:sky blue 0 */ + background: #e6f3ff; +} +.listing_code .programlisting { + /* override from previous */ + border: none 0px; + padding: 0px; +} +.listing_lines pre, .listing_code pre { + margin: 0px; +} + diff --git a/docs/reference/html/up.png b/docs/reference/html/up.png new file mode 100644 index 0000000000000000000000000000000000000000..8eb591f3b8d09f472b1d32c003da9647394a3823 GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjuRL8GLn>~)ovO&!Y#`Dmc%rM5 zQ$@(ou+gP}oo|CI>vraXhEtsWyWLqh`I+o4O4_JnaHZ1HsZSD%fxx + + Frequently Asked Questions + 3 + Frequently Asked Questions + + + Frequently Asked Questions + +Find answers to common questions in the GMime manual + + + + Questions and Answers + This is an "index" of the reference manual + organized by common "How do I..." questions. If you + aren't sure which documentation to read for the question you have, + this list is a good place to start. + + + + General + + Where can I get help with GMime, submit a bug report, or make a feature request? + + See the documentation on this + topic. + + + + How do I port from one GMime version to another? + + See the list of + incompatible changes from 2.2 to 2.4. + + + + How does memory management work in GMime? Should I free data returned from functions? + + Most accessor functions return a pointer to internal + members. When these internal members are objects + themselves (e.g. subclasses + of GObject), + there is no need to unref them unless otherwise stated in + the documentation for that particular function. + For accessor functions that return strings, they will be + declared "const" if they should not be freed. Non-const + strings should be freed with g_free(). + + + + How do I use GMime with threads? + + First, read the GThread documentation for + portable threading primitives. + Secondly, all functions + in gmime-charset, gmime-iconv + and gmime-utils should + be thread-safe. Objects subclassing + GObject + are not. This means that you'll have to do your own mutex + locking if you want to access the same GObjects from + multiple threads. + + + + + How do I use GMime with C++? + + The GMime header files use the subset of C that's + also valid C++, so you can simply use the normal GMime API + in a C++ program. + + + + + + diff --git a/docs/reference/resources.sgml b/docs/reference/resources.sgml new file mode 100644 index 0000000..7904140 --- /dev/null +++ b/docs/reference/resources.sgml @@ -0,0 +1,57 @@ + + + Mailing lists and bug reports + 3 + Mailing lists and bug reports + + + Mailing lists and bug reports + +Getting help with GMime + + + + Filing a bug report or feature request + +If you encounter a bug, misfeature, or missing feature in GMime, please +file a bug report at +http://bugzilla.gnome.org. +We'd also appreciate reports of incomplete or misleading information in +the GMime documentation; file those against the "docs" component of the +"gmime" product in Bugzilla. + + +The bug tracker should definitely be used for feature requests, it's +not only for bugs. We track all GMime development in Bugzilla, so it's +the way to be sure the GMime developers won't forget about an issue. + + + + Submitting Patches + +If you develop a bugfix or enhancement for GMime, please file that in +Bugzilla as well. Bugzilla allows you to attach files; please attach a +patch generated by the diff utility, using the + option to make the patch more readable. All +patches must be offered under the terms of +the LGPLv2.1 +license, so be sure you are authorized to give us the patch under +those terms. + + +If you want to discuss your patch before or after developing it, mail +gmime-devel-list@gnome.org, +but be sure to file +the Bugzilla report as +well, this way it's less likely to slip through the cracks. + + + + Mailing lists + There is currently only one mailing-list devoted to GMime + itself which is for both the development of and development with + GMime. You can subscribe to this list + at http://mail.gnome.org/mailman/listinfo/gmime-devel-list. + + + diff --git a/docs/reference/streams.sgml b/docs/reference/streams.sgml new file mode 100644 index 0000000..de2926f --- /dev/null +++ b/docs/reference/streams.sgml @@ -0,0 +1,73 @@ + + + GMime Streams + GMime Library + + + + GMime Streams + How to use GMime Streams + + + Overview of Streams + Streams are the fundamental method for reading and writing + data used by GMime. You'll probably notice that the basic API is + similar to that of the low-level Unix I/O layer (read(), write(), + lseek(), etc) with some additional nicities such as a printf-like + function. + + The three (3) basic stream types are: GMimeStreamFile, + GMimeStreamFs and GMimeStreamMem. You can manipulate all three + streams using the GMimeStream interfaces. In addition, some of + these streams have extended interfaces to allow more fine grained + manipulation. + + GMimeStreamFile and GMimeStreamFs are very similar in that + they are both meant for reading and writing data to the file + system (in the form of files). Since GMimeStreamFile is an + abstracted layer above the standard libc FILE type, one of the + added benefits is buffered I/O. GMimeStreamFs, on the other hand, + is an abstracted layer above Unix file descriptors. While a + GMimeStreamFs can be used on top of a UNIX socket or pipe, you + must be careful because sockets and pipes are not seekable. + + Unlike the previous 2 stream types, GMimeStreamMem does not + interact with the file system at all (except maybe the swap + partition/file indirectly). Memory streams are handy when you want + reads and writes to be nearly instantaneous and/or if you don't + want to create a temporary file on disk. + + The four (4) advanced stream types are GMimeStreamMmap, + GMimeStreamNull, GMimeStreamBuffer and GMimeStreamFilter. + + Our most simple stream, GMimeStreamNull, is the stream + equivalent of /dev/null on Unix systems. The main difference is + that GMimeStreamNull records the number of bytes written to it - + you may find this useful if you need to know the number of bytes a + GMimeObject (for example) will require. + + GMimeStreamMmap is a memory-mapped stream. This isn't + guarenteed to work on all systems since not all systems support + the POSIX mmap system call, but for those that do - this might + present a faster stream than GMimeStreamFs and/or + GMimeStreamFile. You'll have to do some experimentation to know + for sure. + + The GMimeStreamBuffer can be used on top of any other type + of stream and has 3 modes: block reads, block writes, and cached + reads. Block reads are especially useful if you will be making a + lot of small reads from a stream that accesses the file + system. Block writes are useful for very much the same reason. The + final mode, cached reads, can become memory intensive but can be + very helpful when inheriting from a stream that does not support + seeking (Note: this mode is the least tested so be careful using + it). + + Our final stream type, GMimeStreamFilter, can also be used + on top of another stream. This stream, as you may have guessed, + filters reads and writes to its inherited stream. For example, one + could write a compression filter and apply it to a + GMimeStreamFilter and any further reads or writes would be + (un)compressed. + + diff --git a/docs/reference/tmpl/gmime-certificate.sgml b/docs/reference/tmpl/gmime-certificate.sgml new file mode 100644 index 0000000..32d0fff --- /dev/null +++ b/docs/reference/tmpl/gmime-certificate.sgml @@ -0,0 +1,390 @@ + +gmime-certificate + + + + + + + + + + + + + + + + + + + + + + + + + +@GMIME_PUBKEY_ALGO_DEFAULT: +@GMIME_PUBKEY_ALGO_RSA: +@GMIME_PUBKEY_ALGO_RSA_E: +@GMIME_PUBKEY_ALGO_RSA_S: +@GMIME_PUBKEY_ALGO_ELG_E: +@GMIME_PUBKEY_ALGO_DSA: +@GMIME_PUBKEY_ALGO_ELG: + + + + + + +@GMIME_DIGEST_ALGO_DEFAULT: +@GMIME_DIGEST_ALGO_MD5: +@GMIME_DIGEST_ALGO_SHA1: +@GMIME_DIGEST_ALGO_RIPEMD160: +@GMIME_DIGEST_ALGO_MD2: +@GMIME_DIGEST_ALGO_TIGER192: +@GMIME_DIGEST_ALGO_HAVAL5160: +@GMIME_DIGEST_ALGO_SHA256: +@GMIME_DIGEST_ALGO_SHA384: +@GMIME_DIGEST_ALGO_SHA512: +@GMIME_DIGEST_ALGO_SHA224: +@GMIME_DIGEST_ALGO_MD4: + + + + + + +@GMIME_CERTIFICATE_TRUST_NONE: +@GMIME_CERTIFICATE_TRUST_NEVER: +@GMIME_CERTIFICATE_TRUST_UNDEFINED: +@GMIME_CERTIFICATE_TRUST_MARGINAL: +@GMIME_CERTIFICATE_TRUST_FULLY: +@GMIME_CERTIFICATE_TRUST_ULTIMATE: + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@algo: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@algo: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@issuer_serial: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@issuer_name: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@fingerprint: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@created: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@expires: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@key_id: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@trust: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@email: + + + + + + + +@cert: +@Returns: + + + + + + + +@cert: +@name: + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@list: + + + + + + + +@list: +@cert: +@Returns: + + + + + + + +@list: +@index: +@cert: + + + + + + + +@list: +@cert: +@Returns: + + + + + + + +@list: +@index: +@Returns: + + + + + + + +@list: +@cert: +@Returns: + + + + + + + +@list: +@cert: +@Returns: + + + + + + + +@list: +@index: +@Returns: + + + + + + + +@list: +@index: +@cert: + + diff --git a/docs/reference/tmpl/gmime-charset.sgml b/docs/reference/tmpl/gmime-charset.sgml new file mode 100644 index 0000000..381da8a --- /dev/null +++ b/docs/reference/tmpl/gmime-charset.sgml @@ -0,0 +1,184 @@ + +gmime-charset + + + + + + + + + + + + + + + + + + + + + + + + + +@mask: +@level: + + + + + + +@void: + + + + + + + +@void: + + + + + + + +@void: +@Returns: + + + + + + + +@void: +@Returns: + + + + + + + +@charset: +@Returns: + + + + + + + +@charset: +@Returns: + + + + + + + +@charset: +@Returns: + + + + + + + +@charset: +@Returns: + + + + + + + +@void: +@Returns: + + + + + + + +@isocharset: +@Returns: + + + + + + + +@charset: + + + + + + + +@charset: +@inbuf: +@inlen: + + + + + + + +@charset: +@Returns: + + + + + + + +@inbuf: +@inlen: +@Returns: + + + + + + + +@mask: +@charset: +@text: +@len: +@Returns: + + + + + + + +@charsets: + + + + + + + +@void: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-cipher-context.sgml b/docs/reference/tmpl/gmime-cipher-context.sgml new file mode 100644 index 0000000..f458d30 --- /dev/null +++ b/docs/reference/tmpl/gmime-cipher-context.sgml @@ -0,0 +1,569 @@ + +gmime-cipher-context + + + + + + + + + + + + + + + + + + + + + + + + + +@ctx: +@user_id: +@prompt_ctx: +@reprompt: +@response: +@err: +@Returns: + + + + + + + +@GMIME_CIPHER_HASH_DEFAULT: +@GMIME_CIPHER_HASH_MD2: +@GMIME_CIPHER_HASH_MD5: +@GMIME_CIPHER_HASH_SHA1: +@GMIME_CIPHER_HASH_SHA224: +@GMIME_CIPHER_HASH_SHA256: +@GMIME_CIPHER_HASH_SHA384: +@GMIME_CIPHER_HASH_SHA512: +@GMIME_CIPHER_HASH_RIPEMD160: +@GMIME_CIPHER_HASH_TIGER192: +@GMIME_CIPHER_HASH_HAVAL5160: + + + + + + + + + + + + +@status: +@signers: +@details: + + + + + + +@GMIME_SIGNATURE_STATUS_NONE: +@GMIME_SIGNATURE_STATUS_GOOD: +@GMIME_SIGNATURE_STATUS_BAD: +@GMIME_SIGNATURE_STATUS_UNKNOWN: + + + + + + +@GMIME_SIGNER_STATUS_NONE: +@GMIME_SIGNER_STATUS_GOOD: +@GMIME_SIGNER_STATUS_BAD: +@GMIME_SIGNER_STATUS_ERROR: + + + + + + +@GMIME_SIGNER_TRUST_NONE: +@GMIME_SIGNER_TRUST_NEVER: +@GMIME_SIGNER_TRUST_UNDEFINED: +@GMIME_SIGNER_TRUST_MARGINAL: +@GMIME_SIGNER_TRUST_FULLY: +@GMIME_SIGNER_TRUST_ULTIMATE: + + + + + + +@GMIME_SIGNER_ERROR_NONE: +@GMIME_SIGNER_ERROR_EXPSIG: +@GMIME_SIGNER_ERROR_NO_PUBKEY: +@GMIME_SIGNER_ERROR_EXPKEYSIG: +@GMIME_SIGNER_ERROR_REVKEYSIG: + + + + + + +@next: +@status: +@errors: +@trust: +@unused: +@issuer_serial: +@issuer_name: +@fingerprint: +@sig_created: +@sig_expires: +@key_created: +@key_expires: +@keyid: +@email: +@name: + + + + + + +@ctx: +@request_passwd: + + + + + + + +@ctx: +@hash: +@Returns: + + + + + + + +@ctx: +@hash: +@Returns: + + + + + + + +@ctx: +@userid: +@hash: +@istream: +@ostream: +@err: +@Returns: + + + + + + + +@ctx: +@hash: +@istream: +@sigstream: +@err: +@Returns: + + + + + + + +@ctx: +@sign: +@userid: +@recipients: +@istream: +@ostream: +@err: +@Returns: + + + + + + + +@ctx: +@istream: +@ostream: +@err: +@Returns: + + + + + + + +@ctx: +@istream: +@err: +@Returns: + + + + + + + +@ctx: +@keys: +@ostream: +@err: +@Returns: + + + + + + + +@void: +@Returns: + + + + + + + +@signer: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@status: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@error: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@trust: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@issuer_serial: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@issuer_name: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@fingerprint: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@created: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@expires: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@created: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@expires: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@key_id: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@email: + + + + + + + +@signer: +@Returns: + + + + + + + +@signer: +@name: + + + + + + + +@void: +@Returns: + + + + + + + +@validity: + + + + + + + +@validity: +@status: + + + + + + + +@validity: +@Returns: + + + + + + + +@validity: +@details: + + + + + + + +@validity: +@Returns: + + + + + + + +@validity: +@signer: + + + + + + + +@validity: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-content-type.sgml b/docs/reference/tmpl/gmime-content-type.sgml new file mode 100644 index 0000000..897dfbf --- /dev/null +++ b/docs/reference/tmpl/gmime-content-type.sgml @@ -0,0 +1,141 @@ + +gmime-content-type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@type: +@subtype: +@Returns: + + + + + + + +@str: +@Returns: + + + + + + + +@mime_type: +@Returns: + + + + + + + +@mime_type: +@type: +@subtype: +@Returns: + + + + + + + +@mime_type: +@Returns: + + + + + + + +@mime_type: +@type: + + + + + + + +@mime_type: +@Returns: + + + + + + + +@mime_type: +@subtype: + + + + + + + +@mime_type: +@Returns: + + + + + + + +@mime_type: +@params: + + + + + + + +@mime_type: +@attribute: +@Returns: + + + + + + + +@mime_type: +@attribute: +@value: + + diff --git a/docs/reference/tmpl/gmime-crypto-context.sgml b/docs/reference/tmpl/gmime-crypto-context.sgml new file mode 100644 index 0000000..63ed892 --- /dev/null +++ b/docs/reference/tmpl/gmime-crypto-context.sgml @@ -0,0 +1,286 @@ + +gmime-crypto-context + + + + + + + + + + + + + + + + + + + + + + + + + +@ctx: +@user_id: +@prompt_ctx: +@reprompt: +@response: +@err: +@Returns: + + + + + + + + + + + + + +@ctx: +@request_passwd: + + + + + + + +@ctx: +@Returns: + + + + + + + +@ctx: +@Returns: + + + + + + + +@ctx: +@Returns: + + + + + + + +@ctx: +@name: +@Returns: + + + + + + + +@ctx: +@digest: +@Returns: + + + + + + + +@ctx: +@userid: +@digest: +@istream: +@ostream: +@err: +@Returns: + + + + + + + +@ctx: +@digest: +@istream: +@sigstream: +@err: +@Returns: + + + + + + + +@ctx: +@sign: +@userid: +@digest: +@recipients: +@istream: +@ostream: +@err: +@Returns: + + + + + + + +@ctx: +@istream: +@ostream: +@err: +@Returns: + + + + + + + +@ctx: +@istream: +@err: +@Returns: + + + + + + + +@ctx: +@keys: +@ostream: +@err: +@Returns: + + + + + + + +@GMIME_CIPHER_ALGO_DEFAULT: +@GMIME_CIPHER_ALGO_IDEA: +@GMIME_CIPHER_ALGO_3DES: +@GMIME_CIPHER_ALGO_CAST5: +@GMIME_CIPHER_ALGO_BLOWFISH: +@GMIME_CIPHER_ALGO_AES: +@GMIME_CIPHER_ALGO_AES192: +@GMIME_CIPHER_ALGO_AES256: +@GMIME_CIPHER_ALGO_TWOFISH: +@GMIME_CIPHER_ALGO_CAMELLIA128: +@GMIME_CIPHER_ALGO_CAMELLIA192: +@GMIME_CIPHER_ALGO_CAMELLIA256: + + + + + + +@parent_object: +@recipients: +@signatures: +@cipher: +@mdc: + + + + + + +@void: +@Returns: + + + + + + + +@result: +@Returns: + + + + + + + +@result: +@recipients: + + + + + + + +@result: +@Returns: + + + + + + + +@result: +@signatures: + + + + + + + +@result: +@Returns: + + + + + + + +@result: +@cipher: + + + + + + + +@result: +@Returns: + + + + + + + +@result: +@mdc: + + diff --git a/docs/reference/tmpl/gmime-data-wrapper.sgml b/docs/reference/tmpl/gmime-data-wrapper.sgml new file mode 100644 index 0000000..5e6a94a --- /dev/null +++ b/docs/reference/tmpl/gmime-data-wrapper.sgml @@ -0,0 +1,93 @@ + +gmime-data-wrapper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@stream: +@encoding: +@Returns: + + + + + + + +@wrapper: +@stream: + + + + + + + +@wrapper: +@Returns: + + + + + + + +@wrapper: +@encoding: + + + + + + + +@wrapper: +@Returns: + + + + + + + +@wrapper: +@stream: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-disposition.sgml b/docs/reference/tmpl/gmime-disposition.sgml new file mode 100644 index 0000000..0472e20 --- /dev/null +++ b/docs/reference/tmpl/gmime-disposition.sgml @@ -0,0 +1,126 @@ + +gmime-disposition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@str: +@Returns: + + + + + + + +@disposition: +@value: + + + + + + + +@disposition: +@Returns: + + + + + + + +@disposition: +@Returns: + + + + + + + +@disposition: +@params: + + + + + + + +@disposition: +@attribute: +@value: + + + + + + + +@disposition: +@attribute: +@Returns: + + + + + + + +@disposition: +@fold: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-encodings.sgml b/docs/reference/tmpl/gmime-encodings.sgml new file mode 100644 index 0000000..0decbaa --- /dev/null +++ b/docs/reference/tmpl/gmime-encodings.sgml @@ -0,0 +1,297 @@ + +gmime-encodings + + + + + + + + + + + + + + + + + + + + + + + + + +@GMIME_CONTENT_ENCODING_DEFAULT: +@GMIME_CONTENT_ENCODING_7BIT: +@GMIME_CONTENT_ENCODING_8BIT: +@GMIME_CONTENT_ENCODING_BINARY: +@GMIME_CONTENT_ENCODING_BASE64: +@GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: +@GMIME_CONTENT_ENCODING_UUENCODE: + + + + + + +@str: +@Returns: + + + + + + + +@encoding: +@Returns: + + + + + + + +@GMIME_ENCODING_CONSTRAINT_7BIT: +@GMIME_ENCODING_CONSTRAINT_8BIT: +@GMIME_ENCODING_CONSTRAINT_BINARY: + + + + + + +@encoding: +@uubuf: +@encode: +@save: +@state: + + + + + + +@state: +@encoding: + + + + + + + +@state: +@encoding: + + + + + + + +@state: + + + + + + + +@state: +@inlen: +@Returns: + + + + + + + +@state: +@inbuf: +@inlen: +@outbuf: +@Returns: + + + + + + + +@state: +@inbuf: +@inlen: +@outbuf: +@Returns: + + + + + + + +@x: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@state: +@save: +@Returns: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@state: +@save: +@Returns: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@state: +@save: +@Returns: + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@x: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@state: +@save: +@Returns: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@uubuf: +@state: +@save: +@Returns: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@uubuf: +@state: +@save: +@Returns: + + + + + + + +@x: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@state: +@save: +@Returns: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@state: +@save: +@Returns: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@state: +@save: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-error.sgml b/docs/reference/tmpl/gmime-error.sgml new file mode 100644 index 0000000..dfe460e --- /dev/null +++ b/docs/reference/tmpl/gmime-error.sgml @@ -0,0 +1,37 @@ + +gmime-error + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@error: + + diff --git a/docs/reference/tmpl/gmime-filter-basic.sgml b/docs/reference/tmpl/gmime-filter-basic.sgml new file mode 100644 index 0000000..5be9a74 --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-basic.sgml @@ -0,0 +1,38 @@ + +gmime-filter-basic + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@encoding: +@encode: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter-best.sgml b/docs/reference/tmpl/gmime-filter-best.sgml new file mode 100644 index 0000000..8ab7f2c --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-best.sgml @@ -0,0 +1,64 @@ + +gmime-filter-best + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@GMIME_FILTER_BEST_CHARSET: +@GMIME_FILTER_BEST_ENCODING: + + + + + + +@flags: +@Returns: + + + + + + + +@best: +@Returns: + + + + + + + +@best: +@constraint: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter-charset.sgml b/docs/reference/tmpl/gmime-filter-charset.sgml new file mode 100644 index 0000000..7ce6055 --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-charset.sgml @@ -0,0 +1,38 @@ + +gmime-filter-charset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@from_charset: +@to_charset: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter-crlf.sgml b/docs/reference/tmpl/gmime-filter-crlf.sgml new file mode 100644 index 0000000..0fba1da --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-crlf.sgml @@ -0,0 +1,38 @@ + +gmime-filter-crlf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@encode: +@dots: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter-enriched.sgml b/docs/reference/tmpl/gmime-filter-enriched.sgml new file mode 100644 index 0000000..6ae741c --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-enriched.sgml @@ -0,0 +1,44 @@ + +gmime-filter-enriched + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@flags: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter-from.sgml b/docs/reference/tmpl/gmime-filter-from.sgml new file mode 100644 index 0000000..2183889 --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-from.sgml @@ -0,0 +1,46 @@ + +gmime-filter-from + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@GMIME_FILTER_FROM_MODE_DEFAULT: +@GMIME_FILTER_FROM_MODE_ESCAPE: +@GMIME_FILTER_FROM_MODE_ARMOR: + + + + + + +@mode: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter-gzip.sgml b/docs/reference/tmpl/gmime-filter-gzip.sgml new file mode 100644 index 0000000..cfc9103 --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-gzip.sgml @@ -0,0 +1,46 @@ + +gmime-filter-gzip + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@GMIME_FILTER_GZIP_MODE_ZIP: +@GMIME_FILTER_GZIP_MODE_UNZIP: + + + + + + +@mode: +@level: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter-html.sgml b/docs/reference/tmpl/gmime-filter-html.sgml new file mode 100644 index 0000000..6de0c4f --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-html.sgml @@ -0,0 +1,94 @@ + +gmime-filter-html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@flags: +@colour: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter-md5.sgml b/docs/reference/tmpl/gmime-filter-md5.sgml new file mode 100644 index 0000000..bbf595e --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-md5.sgml @@ -0,0 +1,46 @@ + +gmime-filter-md5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@md5: +@digest: + + diff --git a/docs/reference/tmpl/gmime-filter-strip.sgml b/docs/reference/tmpl/gmime-filter-strip.sgml new file mode 100644 index 0000000..458655b --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-strip.sgml @@ -0,0 +1,37 @@ + +gmime-filter-strip + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter-windows.sgml b/docs/reference/tmpl/gmime-filter-windows.sgml new file mode 100644 index 0000000..1298d18 --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-windows.sgml @@ -0,0 +1,55 @@ + +gmime-filter-windows + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@claimed_charset: +@Returns: + + + + + + + +@filter: +@Returns: + + + + + + + +@filter: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter-yenc.sgml b/docs/reference/tmpl/gmime-filter-yenc.sgml new file mode 100644 index 0000000..ee4cfca --- /dev/null +++ b/docs/reference/tmpl/gmime-filter-yenc.sgml @@ -0,0 +1,186 @@ + +gmime-filter-yenc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@encode: +@Returns: + + + + + + + +@yenc: +@state: + + + + + + + +@yenc: +@crc: + + + + + + + +@yenc: +@Returns: + + + + + + + +@yenc: +@Returns: + + + + + + + + + + + + + + +@crc: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@inbuf: +@inlen: +@outbuf: +@state: +@pcrc: +@crc: +@Returns: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@state: +@pcrc: +@crc: +@Returns: + + + + + + + +@inbuf: +@inlen: +@outbuf: +@state: +@pcrc: +@crc: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-filter.sgml b/docs/reference/tmpl/gmime-filter.sgml new file mode 100644 index 0000000..6202aa0 --- /dev/null +++ b/docs/reference/tmpl/gmime-filter.sgml @@ -0,0 +1,93 @@ + +gmime-filter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@filter: +@Returns: + + + + + + + +@filter: +@inbuf: +@inlen: +@prespace: +@outbuf: +@outlen: +@outprespace: + + + + + + + +@filter: +@inbuf: +@inlen: +@prespace: +@outbuf: +@outlen: +@outprespace: + + + + + + + +@filter: + + + + + + + +@filter: +@data: +@length: + + + + + + + +@filter: +@size: +@keep: + + diff --git a/docs/reference/tmpl/gmime-gpg-context.sgml b/docs/reference/tmpl/gmime-gpg-context.sgml new file mode 100644 index 0000000..bdc906a --- /dev/null +++ b/docs/reference/tmpl/gmime-gpg-context.sgml @@ -0,0 +1,92 @@ + +gmime-gpg-context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@request_passwd: +@path: +@Returns: + + + + + + + +@ctx: +@Returns: + + + + + + + +@ctx: +@always_trust: + + + + + + + +@ctx: +@Returns: + + + + + + + +@ctx: +@auto_key_retrieve: + + + + + + + +@ctx: +@Returns: + + + + + + + +@ctx: +@use_agent: + + diff --git a/docs/reference/tmpl/gmime-header.sgml b/docs/reference/tmpl/gmime-header.sgml new file mode 100644 index 0000000..10a7f3a --- /dev/null +++ b/docs/reference/tmpl/gmime-header.sgml @@ -0,0 +1,337 @@ + +gmime-header + + + + + + + + + + + + + + + + + + + + + + + + + +@hdrlist: +@cursor: +@version: + + + + + + + + + + + + +@stream: +@name: +@value: +@Returns: + + + + + + + +@name: +@value: +@user_data: + + + + + + + +@void: +@Returns: + + + + + + + +@iter: + + + + + + + +@iter: +@Returns: + + + + + + + +@src: +@dest: + + + + + + + +@iter1: +@iter2: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@value: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@void: +@Returns: + + + + + + + +@headers: + + + + + + + +@headers: + + + + + + + +@headers: +@name: +@Returns: + + + + + + + +@headers: +@name: +@value: + + + + + + + +@headers: +@name: +@value: + + + + + + + +@headers: +@name: +@Returns: + + + + + + + +@headers: +@name: +@value: + + + + + + + +@headers: +@name: +@Returns: + + + + + + + +@headers: +@iter: +@Returns: + + + + + + + +@headers: +@func: +@user_data: + + + + + + + +@headers: +@name: +@writer: + + + + + + + +@headers: +@stream: +@Returns: + + + + + + + +@headers: +@Returns: + + + + + + + +@headers: +@Returns: + + + + + + + +@headers: +@stream: + + diff --git a/docs/reference/tmpl/gmime-iconv-utils.sgml b/docs/reference/tmpl/gmime-iconv-utils.sgml new file mode 100644 index 0000000..d68ec1d --- /dev/null +++ b/docs/reference/tmpl/gmime-iconv-utils.sgml @@ -0,0 +1,81 @@ + +gmime-iconv-utils + + + + + + + + + + + + + + + + + + + + + + + + + +@cd: +@str: +@Returns: + + + + + + + +@cd: +@str: +@n: +@Returns: + + + + + + + +@str: +@Returns: + + + + + + + +@str: +@n: +@Returns: + + + + + + + +@str: +@Returns: + + + + + + + +@str: +@n: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-iconv.sgml b/docs/reference/tmpl/gmime-iconv.sgml new file mode 100644 index 0000000..260482d --- /dev/null +++ b/docs/reference/tmpl/gmime-iconv.sgml @@ -0,0 +1,69 @@ + +gmime-iconv + + + + + + + + + + + + + + + + + + + + + + + + + +@void: + + + + + + + +@void: + + + + + + + +@to: +@from: +@Returns: + + + + + + + +@cd: +@inbuf: +@inleft: +@outbuf: +@outleft: + + + + + + + +@cd: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-message-part.sgml b/docs/reference/tmpl/gmime-message-part.sgml new file mode 100644 index 0000000..d65aee2 --- /dev/null +++ b/docs/reference/tmpl/gmime-message-part.sgml @@ -0,0 +1,65 @@ + +gmime-message-part + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@subtype: +@Returns: + + + + + + + +@subtype: +@message: +@Returns: + + + + + + + +@part: +@Returns: + + + + + + + +@part: +@message: + + diff --git a/docs/reference/tmpl/gmime-message-partial.sgml b/docs/reference/tmpl/gmime-message-partial.sgml new file mode 100644 index 0000000..b6f1720 --- /dev/null +++ b/docs/reference/tmpl/gmime-message-partial.sgml @@ -0,0 +1,87 @@ + +gmime-message-partial + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@id: +@number: +@total: +@Returns: + + + + + + + +@partial: +@Returns: + + + + + + + +@partial: +@Returns: + + + + + + + +@partial: +@Returns: + + + + + + + +@partials: +@num: +@Returns: + + + + + + + +@message: +@max_size: +@nparts: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-message.sgml b/docs/reference/tmpl/gmime-message.sgml new file mode 100644 index 0000000..29dc5bc --- /dev/null +++ b/docs/reference/tmpl/gmime-message.sgml @@ -0,0 +1,223 @@ + +gmime-message + + + + + + + + + + + + + + + + + + + + + + + + + +@GMIME_RECIPIENT_TYPE_TO: +@GMIME_RECIPIENT_TYPE_CC: +@GMIME_RECIPIENT_TYPE_BCC: + + + + + + + + + + + + +@pretty_headers: +@Returns: + + + + + + + +@message: +@sender: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@reply_to: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@type: +@name: +@addr: + + + + + + + +@message: +@type: +@Returns: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@subject: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@date: +@tz_offset: + + + + + + + +@message: +@date: +@tz_offset: + + + + + + + +@message: +@str: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@message_id: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@mime_part: + + + + + + + +@message: +@Returns: + + + + + + + +@message: +@callback: +@user_data: + + + + + + + +@message: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-multipart-encrypted.sgml b/docs/reference/tmpl/gmime-multipart-encrypted.sgml new file mode 100644 index 0000000..d94b953 --- /dev/null +++ b/docs/reference/tmpl/gmime-multipart-encrypted.sgml @@ -0,0 +1,65 @@ + +gmime-multipart-encrypted + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@mpe: +@content: +@ctx: +@sign: +@userid: +@digest: +@recipients: +@err: +@Returns: + + + + + + + +@mpe: +@ctx: +@result: +@err: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-multipart-signed.sgml b/docs/reference/tmpl/gmime-multipart-signed.sgml new file mode 100644 index 0000000..ec02cc5 --- /dev/null +++ b/docs/reference/tmpl/gmime-multipart-signed.sgml @@ -0,0 +1,62 @@ + +gmime-multipart-signed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@mps: +@content: +@ctx: +@userid: +@digest: +@err: +@Returns: + + + + + + + +@mps: +@ctx: +@err: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-multipart.sgml b/docs/reference/tmpl/gmime-multipart.sgml new file mode 100644 index 0000000..3f99762 --- /dev/null +++ b/docs/reference/tmpl/gmime-multipart.sgml @@ -0,0 +1,217 @@ + +gmime-multipart + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@subtype: +@Returns: + + + + + + + +@multipart: +@preface: + + + + + + + +@multipart: +@Returns: + + + + + + + +@multipart: +@postface: + + + + + + + +@multipart: +@Returns: + + + + + + + +@multipart: +@boundary: + + + + + + + +@multipart: +@Returns: + + + + + + + +@multipart: +@Returns: + + + + + + + +@multipart: +@part: +@Returns: + + + + + + + +@multipart: +@part: +@Returns: + + + + + + + +@multipart: +@part: + + + + + + + +@multipart: + + + + + + + +@multipart: +@index: +@part: + + + + + + + +@multipart: +@part: +@Returns: + + + + + + + +@multipart: +@index: +@Returns: + + + + + + + +@multipart: +@index: +@replacement: +@Returns: + + + + + + + +@multipart: +@index: +@Returns: + + + + + + + +@multipart: +@callback: +@user_data: + + + + + + + +@multipart: +@content_id: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-object.sgml b/docs/reference/tmpl/gmime-object.sgml new file mode 100644 index 0000000..fdfaaaf --- /dev/null +++ b/docs/reference/tmpl/gmime-object.sgml @@ -0,0 +1,275 @@ + +gmime-object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parent: +@part: +@user_data: + + + + + + + +@type: +@subtype: +@object_type: + + + + + + + +@content_type: +@Returns: + + + + + + + +@type: +@subtype: +@Returns: + + + + + + + +@object: +@content_type: + + + + + + + +@object: +@Returns: + + + + + + + +@object: +@name: +@value: + + + + + + + +@object: +@name: +@Returns: + + + + + + + +@object: +@disposition: + + + + + + + +@object: +@Returns: + + + + + + + +@object: +@disposition: + + + + + + + +@object: +@Returns: + + + + + + + +@object: +@attribute: +@value: + + + + + + + +@object: +@attribute: +@Returns: + + + + + + + +@object: +@content_id: + + + + + + + +@object: +@Returns: + + + + + + + +@object: +@header: +@value: + + + + + + + +@object: +@header: +@value: + + + + + + + +@object: +@header: +@Returns: + + + + + + + +@object: +@header: +@value: + + + + + + + +@object: +@header: +@Returns: + + + + + + + +@object: +@Returns: + + + + + + + +@object: +@Returns: + + + + + + + +@object: +@stream: +@Returns: + + + + + + + +@object: +@Returns: + + + + + + + +@object: +@constraint: + + diff --git a/docs/reference/tmpl/gmime-param.sgml b/docs/reference/tmpl/gmime-param.sgml new file mode 100644 index 0000000..9c495f0 --- /dev/null +++ b/docs/reference/tmpl/gmime-param.sgml @@ -0,0 +1,116 @@ + +gmime-param + + + + + + + + + + + + + + + + + + + + + + + + + +@next: +@name: +@value: + + + + + + +@name: +@value: +@Returns: + + + + + + + +@str: +@Returns: + + + + + + + +@param: + + + + + + + +@param: +@Returns: + + + + + + + +@param: +@Returns: + + + + + + + +@param: +@Returns: + + + + + + + +@params: +@name: +@value: +@Returns: + + + + + + + +@params: +@param: +@Returns: + + + + + + + +@param: +@fold: +@str: + + diff --git a/docs/reference/tmpl/gmime-parser.sgml b/docs/reference/tmpl/gmime-parser.sgml new file mode 100644 index 0000000..299b847 --- /dev/null +++ b/docs/reference/tmpl/gmime-parser.sgml @@ -0,0 +1,204 @@ + +gmime-parser + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@parser: +@header: +@value: +@offset: +@user_data: + + + + + + + +@void: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@parser: +@stream: + + + + + + + +@parser: +@Returns: + + + + + + + +@parser: +@persist: + + + + + + + +@parser: +@Returns: + + + + + + + +@parser: +@scan_from: + + + + + + + +@parser: +@Returns: + + + + + + + +@parser: +@respect_content_length: + + + + + + + +@parser: +@regex: +@header_cb: +@user_data: + + + + + + + +@parser: +@Returns: + + + + + + + +@parser: +@Returns: + + + + + + + +@parser: +@Returns: + + + + + + + +@parser: +@Returns: + + + + + + + +@parser: +@Returns: + + + + + + + +@parser: +@Returns: + + + + + + + +@parser: +@Returns: + + + + + + + +@parser: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-part-iter.sgml b/docs/reference/tmpl/gmime-part-iter.sgml new file mode 100644 index 0000000..1dbea9f --- /dev/null +++ b/docs/reference/tmpl/gmime-part-iter.sgml @@ -0,0 +1,145 @@ + +gmime-part-iter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@toplevel: +@Returns: + + + + + + + +@iter: + + + + + + + +@iter: + + + + + + + +@iter: +@path: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@Returns: + + + + + + + +@iter: +@replacement: +@Returns: + + + + + + + +@iter: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-part.sgml b/docs/reference/tmpl/gmime-part.sgml new file mode 100644 index 0000000..abbdf2a --- /dev/null +++ b/docs/reference/tmpl/gmime-part.sgml @@ -0,0 +1,192 @@ + +gmime-part + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@type: +@subtype: +@Returns: + + + + + + + +@mime_part: +@description: + + + + + + + +@mime_part: +@Returns: + + + + + + + +@mime_part: +@content_id: + + + + + + + +@mime_part: +@Returns: + + + + + + + +@mime_part: +@content_md5: + + + + + + + +@mime_part: +@Returns: + + + + + + + +@mime_part: +@Returns: + + + + + + + +@mime_part: +@content_location: + + + + + + + +@mime_part: +@Returns: + + + + + + + +@mime_part: +@encoding: + + + + + + + +@mime_part: +@Returns: + + + + + + + +@mime_part: +@constraint: +@Returns: + + + + + + + +@mime_part: +@filename: + + + + + + + +@mime_part: +@Returns: + + + + + + + +@mime_part: +@Returns: + + + + + + + +@mime_part: +@content: + + diff --git a/docs/reference/tmpl/gmime-pkcs7-context.sgml b/docs/reference/tmpl/gmime-pkcs7-context.sgml new file mode 100644 index 0000000..bc873dc --- /dev/null +++ b/docs/reference/tmpl/gmime-pkcs7-context.sgml @@ -0,0 +1,55 @@ + +gmime-pkcs7-context + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@request_passwd: +@Returns: + + + + + + + +@ctx: +@Returns: + + + + + + + +@ctx: +@always_trust: + + diff --git a/docs/reference/tmpl/gmime-session-simple.sgml b/docs/reference/tmpl/gmime-session-simple.sgml new file mode 100644 index 0000000..1d95224 --- /dev/null +++ b/docs/reference/tmpl/gmime-session-simple.sgml @@ -0,0 +1,52 @@ + +gmime-session-simple + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@session: +@request_passwd: + + + + + + + +@session: +@forget_passwd: + + + + + + + +@session: +@is_online: + + diff --git a/docs/reference/tmpl/gmime-session.sgml b/docs/reference/tmpl/gmime-session.sgml new file mode 100644 index 0000000..fdb4890 --- /dev/null +++ b/docs/reference/tmpl/gmime-session.sgml @@ -0,0 +1,57 @@ + +gmime-session + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@session: +@prompt: +@secret: +@item: +@err: +@Returns: + + + + + + + +@session: +@item: +@err: + + + + + + + +@session: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-signature.sgml b/docs/reference/tmpl/gmime-signature.sgml new file mode 100644 index 0000000..c11c974 --- /dev/null +++ b/docs/reference/tmpl/gmime-signature.sgml @@ -0,0 +1,260 @@ + +gmime-signature + + + + + + + + + + + + + + + + + + + + + + + + + +@GMIME_SIGNATURE_STATUS_GOOD: +@GMIME_SIGNATURE_STATUS_ERROR: +@GMIME_SIGNATURE_STATUS_BAD: + + + + + + +@GMIME_SIGNATURE_ERROR_NONE: +@GMIME_SIGNATURE_ERROR_EXPSIG: +@GMIME_SIGNATURE_ERROR_NO_PUBKEY: +@GMIME_SIGNATURE_ERROR_EXPKEYSIG: +@GMIME_SIGNATURE_ERROR_REVKEYSIG: +@GMIME_SIGNATURE_ERROR_UNSUPP_ALGO: + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@sig: +@Returns: + + + + + + + +@sig: +@cert: + + + + + + + +@sig: +@Returns: + + + + + + + +@sig: +@status: + + + + + + + +@sig: +@Returns: + + + + + + + +@sig: +@errors: + + + + + + + +@sig: +@Returns: + + + + + + + +@sig: +@created: + + + + + + + +@sig: +@Returns: + + + + + + + +@sig: +@expires: + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@list: + + + + + + + +@list: +@sig: +@Returns: + + + + + + + +@list: +@index: +@sig: + + + + + + + +@list: +@sig: +@Returns: + + + + + + + +@list: +@index: +@Returns: + + + + + + + +@list: +@sig: +@Returns: + + + + + + + +@list: +@sig: +@Returns: + + + + + + + +@list: +@index: +@Returns: + + + + + + + +@list: +@index: +@sig: + + diff --git a/docs/reference/tmpl/gmime-stream-buffer.sgml b/docs/reference/tmpl/gmime-stream-buffer.sgml new file mode 100644 index 0000000..cbcc706 --- /dev/null +++ b/docs/reference/tmpl/gmime-stream-buffer.sgml @@ -0,0 +1,67 @@ + +gmime-stream-buffer + + + + + + + + + + + + + + + + + + + + + + + + + +@GMIME_STREAM_BUFFER_CACHE_READ: +@GMIME_STREAM_BUFFER_BLOCK_READ: +@GMIME_STREAM_BUFFER_BLOCK_WRITE: + + + + + + + + + + + + +@source: +@mode: +@Returns: + + + + + + + +@stream: +@buf: +@max: +@Returns: + + + + + + + +@stream: +@buffer: + + diff --git a/docs/reference/tmpl/gmime-stream-cat.sgml b/docs/reference/tmpl/gmime-stream-cat.sgml new file mode 100644 index 0000000..4c17fea --- /dev/null +++ b/docs/reference/tmpl/gmime-stream-cat.sgml @@ -0,0 +1,47 @@ + +gmime-stream-cat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@cat: +@source: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-stream-file.sgml b/docs/reference/tmpl/gmime-stream-file.sgml new file mode 100644 index 0000000..0309a69 --- /dev/null +++ b/docs/reference/tmpl/gmime-stream-file.sgml @@ -0,0 +1,66 @@ + +gmime-stream-file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fp: +@Returns: + + + + + + + +@fp: +@start: +@end: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@owner: + + diff --git a/docs/reference/tmpl/gmime-stream-filter.sgml b/docs/reference/tmpl/gmime-stream-filter.sgml new file mode 100644 index 0000000..cb86fbb --- /dev/null +++ b/docs/reference/tmpl/gmime-stream-filter.sgml @@ -0,0 +1,56 @@ + +gmime-stream-filter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@filter: +@Returns: + + + + + + + +@stream: +@id: + + diff --git a/docs/reference/tmpl/gmime-stream-fs.sgml b/docs/reference/tmpl/gmime-stream-fs.sgml new file mode 100644 index 0000000..fa14bb5 --- /dev/null +++ b/docs/reference/tmpl/gmime-stream-fs.sgml @@ -0,0 +1,66 @@ + +gmime-stream-fs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fd: +@Returns: + + + + + + + +@fd: +@start: +@end: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@owner: + + diff --git a/docs/reference/tmpl/gmime-stream-gio.sgml b/docs/reference/tmpl/gmime-stream-gio.sgml new file mode 100644 index 0000000..fe948db --- /dev/null +++ b/docs/reference/tmpl/gmime-stream-gio.sgml @@ -0,0 +1,72 @@ + +gmime-stream-gio + + + + + + + + + + + + + + + + + + + + + + + + + +@parent_object: +@ostream: +@istream: +@file: +@owner: +@eos: + + + + + + +@file: +@Returns: + + + + + + + +@file: +@start: +@end: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@owner: + + diff --git a/docs/reference/tmpl/gmime-stream-mem.sgml b/docs/reference/tmpl/gmime-stream-mem.sgml new file mode 100644 index 0000000..83664ca --- /dev/null +++ b/docs/reference/tmpl/gmime-stream-mem.sgml @@ -0,0 +1,92 @@ + +gmime-stream-mem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@array: +@Returns: + + + + + + + +@buffer: +@len: +@Returns: + + + + + + + +@mem: +@Returns: + + + + + + + +@mem: +@array: + + + + + + + +@mem: +@Returns: + + + + + + + +@mem: +@owner: + + diff --git a/docs/reference/tmpl/gmime-stream-mmap.sgml b/docs/reference/tmpl/gmime-stream-mmap.sgml new file mode 100644 index 0000000..bbff4d4 --- /dev/null +++ b/docs/reference/tmpl/gmime-stream-mmap.sgml @@ -0,0 +1,52 @@ + +gmime-stream-mmap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fd: +@prot: +@flags: +@Returns: + + + + + + + +@fd: +@prot: +@flags: +@start: +@end: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-stream-null.sgml b/docs/reference/tmpl/gmime-stream-null.sgml new file mode 100644 index 0000000..8f00845 --- /dev/null +++ b/docs/reference/tmpl/gmime-stream-null.sgml @@ -0,0 +1,37 @@ + +gmime-stream-null + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-stream-pipe.sgml b/docs/reference/tmpl/gmime-stream-pipe.sgml new file mode 100644 index 0000000..73a7107 --- /dev/null +++ b/docs/reference/tmpl/gmime-stream-pipe.sgml @@ -0,0 +1,55 @@ + +gmime-stream-pipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@fd: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@owner: + + diff --git a/docs/reference/tmpl/gmime-stream.sgml b/docs/reference/tmpl/gmime-stream.sgml new file mode 100644 index 0000000..f9c149e --- /dev/null +++ b/docs/reference/tmpl/gmime-stream.sgml @@ -0,0 +1,205 @@ + +gmime-stream + + + + + + + + + + + + + + + + + + + + + + + + + +@GMIME_STREAM_SEEK_SET: +@GMIME_STREAM_SEEK_CUR: +@GMIME_STREAM_SEEK_END: + + + + + + +@data: +@len: + + + + + + + + + + + + +@stream: +@start: +@end: + + + + + + + +@stream: +@buf: +@len: +@Returns: + + + + + + + +@stream: +@buf: +@len: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@offset: +@whence: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@Returns: + + + + + + + +@stream: +@start: +@end: +@Returns: + + + + + + + +@stream: +@start: +@end: + + + + + + + +@stream: +@str: +@Returns: + + + + + + + +@stream: +@fmt: +@...: +@Returns: + + + + + + + +@src: +@dest: +@Returns: + + + + + + + +@stream: +@vector: +@count: +@Returns: + + diff --git a/docs/reference/tmpl/gmime-unused.sgml b/docs/reference/tmpl/gmime-unused.sgml new file mode 100644 index 0000000..a46f8d0 --- /dev/null +++ b/docs/reference/tmpl/gmime-unused.sgml @@ -0,0 +1,1182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +gmime-cipher-context + + + + + + + + + + + + + + + + + + + + + + + +gmime-session-simple + + + + + + + + + + + + + + + + + + + + + + + +gmime-session + + + + + + + +@GMIME_BEST_ENCODING_7BIT: +@GMIME_BEST_ENCODING_8BIT: +@GMIME_BEST_ENCODING_BINARY: + + + + + + + + + + + + +@GMIME_CIPHER_HASH_DEFAULT: +@GMIME_CIPHER_HASH_MD2: +@GMIME_CIPHER_HASH_MD5: +@GMIME_CIPHER_HASH_SHA1: +@GMIME_CIPHER_HASH_SHA224: +@GMIME_CIPHER_HASH_SHA256: +@GMIME_CIPHER_HASH_SHA384: +@GMIME_CIPHER_HASH_SHA512: +@GMIME_CIPHER_HASH_RIPEMD160: +@GMIME_CIPHER_HASH_TIGER192: +@GMIME_CIPHER_HASH_HAVAL5160: + + + + + + +@GMIME_CRYPTO_CIPHER_ALGO_DEFAULT: +@GMIME_CRYPTO_CIPHER_ALGO_IDEA: +@GMIME_CRYPTO_CIPHER_ALGO_3DES: +@GMIME_CRYPTO_CIPHER_ALGO_CAST5: +@GMIME_CRYPTO_CIPHER_ALGO_BLOWFISH: +@GMIME_CRYPTO_CIPHER_ALGO_AES: +@GMIME_CRYPTO_CIPHER_ALGO_AES192: +@GMIME_CRYPTO_CIPHER_ALGO_AES256: +@GMIME_CRYPTO_CIPHER_ALGO_TWOFISH: +@GMIME_CRYPTO_CIPHER_ALGO_CAMELLIA128: +@GMIME_CRYPTO_CIPHER_ALGO_CAMELLIA196: +@GMIME_CRYPTO_CIPHER_ALGO_CAMELLIA256: + + + + + + +@GMIME_CRYPTO_HASH_DEFAULT: +@GMIME_CRYPTO_HASH_MD5: +@GMIME_CRYPTO_HASH_SHA1: +@GMIME_CRYPTO_HASH_RIPEMD160: +@GMIME_CRYPTO_HASH_MD2: +@GMIME_CRYPTO_HASH_TIGER192: +@GMIME_CRYPTO_HASH_HAVAL5160: +@GMIME_CRYPTO_HASH_SHA256: +@GMIME_CRYPTO_HASH_SHA384: +@GMIME_CRYPTO_HASH_SHA512: +@GMIME_CRYPTO_HASH_SHA224: +@GMIME_CRYPTO_HASH_MD4: + + + + + + +@pubkey_algo: +@issuer_serial: +@issuer_name: +@fingerprint: +@created: +@expires: +@keyid: +@email: +@name: + + + + + + +@GMIME_CRYPTO_PUBKEY_ALGO_DEFAULT: +@GMIME_CRYPTO_PUBKEY_ALGO_RSA: +@GMIME_CRYPTO_PUBKEY_ALGO_RSA_E: +@GMIME_CRYPTO_PUBKEY_ALGO_RSA_S: +@GMIME_CRYPTO_PUBKEY_ALGO_ELG_E: +@GMIME_CRYPTO_PUBKEY_ALGO_DSA: +@GMIME_CRYPTO_PUBKEY_ALGO_ELG: + + + + + + +@next: +@pubkey_algo: +@keyid: + + + + + + +@validity: +@recipients: +@cipher: +@mdc: + + + + + + + + + + + + + + + + + + +@status: +@signers: +@details: + + + + + + +@next: +@status: +@errors: +@trust: +@unused: +@issuer_serial: +@issuer_name: +@fingerprint: +@sig_created: +@sig_expires: +@key_created: +@key_expires: +@keyid: +@email: +@name: + + + + + + +@GMIME_SIGNER_ERROR_NONE: +@GMIME_SIGNER_ERROR_EXPSIG: +@GMIME_SIGNER_ERROR_NO_PUBKEY: +@GMIME_SIGNER_ERROR_EXPKEYSIG: +@GMIME_SIGNER_ERROR_REVKEYSIG: + + + + + + +@GMIME_SIGNER_STATUS_NONE: +@GMIME_SIGNER_STATUS_GOOD: +@GMIME_SIGNER_STATUS_BAD: +@GMIME_SIGNER_STATUS_ERROR: + + + + + + +@GMIME_SIGNER_TRUST_NONE: +@GMIME_SIGNER_TRUST_NEVER: +@GMIME_SIGNER_TRUST_UNDEFINED: +@GMIME_SIGNER_TRUST_MARGINAL: +@GMIME_SIGNER_TRUST_FULLY: +@GMIME_SIGNER_TRUST_ULTIMATE: + + + + + + +@ctx: +@istream: +@ostream: +@err: +@Returns: + + + + + + +@ctx: +@sign: +@userid: +@recipients: +@istream: +@ostream: +@err: +@Returns: + + + + + + +@ctx: +@keys: +@ostream: +@err: +@Returns: + + + + + + +@ctx: +@hash: +@Returns: + + + + + + +@ctx: +@hash: +@Returns: + + + + + + +@ctx: +@istream: +@err: +@Returns: + + + + + + +@ctx: +@request_passwd: + + + + + + +@ctx: +@userid: +@hash: +@istream: +@ostream: +@err: +@Returns: + + + + + + +@ctx: +@hash: +@istream: +@sigstream: +@err: +@Returns: + + + + + + +@ctx: +@hash: +@Returns: + + + + + + +@ctx: +@hash: +@Returns: + + + + + + +@key: +@Returns: + + + + + + +@key: +@Returns: + + + + + + +@key: +@Returns: + + + + + + +@key: +@Returns: + + + + + + +@key: +@Returns: + + + + + + +@key: +@Returns: + + + + + + +@key: +@Returns: + + + + + + +@key: +@Returns: + + + + + + +@key: +@Returns: + + + + + + +@key: +@created: + + + + + + +@key: +@email: + + + + + + +@key: +@expires: + + + + + + +@key: +@fingerprint: + + + + + + +@key: +@issuer_name: + + + + + + +@key: +@issuer_serial: + + + + + + +@key: +@key_id: + + + + + + +@key: +@name: + + + + + + +@key: +@pubkey_algo: + + + + + + +@recipient: + + + + + + +@recipient: +@Returns: + + + + + + +@recipient: +@Returns: + + + + + + +@void: +@Returns: + + + + + + +@recipient: +@Returns: + + + + + + +@recipient: +@key_id: + + + + + + +@recipient: +@pubkey_algo: + + + + + + +@result: +@recipient: + + + + + + +@result: + + + + + + +@result: +@Returns: + + + + + + +@result: +@Returns: + + + + + + +@result: +@Returns: + + + + + + +@result: +@Returns: + + + + + + +@void: +@Returns: + + + + + + +@result: +@cipher: + + + + + + +@result: +@mdc: + + + + + + +@result: +@validity: + + + + + + +@headers: +@Returns: + + + + + + +@headers: +@raw: + + + + + + +@mpe: +@Returns: + + + + + + +@session: +@item: +@err: + + + + + + +@session: +@Returns: + + + + + + +@session: +@prompt: +@secret: +@item: +@err: +@Returns: + + + + + + +@session: +@forget_passwd: + + + + + + +@session: +@is_online: + + + + + + +@session: +@request_passwd: + + + + + + +@validity: +@signer: + + + + + + +@validity: + + + + + + +@validity: +@Returns: + + + + + + +@validity: +@Returns: + + + + + + +@validity: +@Returns: + + + + + + +@void: +@Returns: + + + + + + +@validity: +@details: + + + + + + +@validity: +@status: + + + + + + +@signer: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@void: +@Returns: + + + + + + +@signer: +@Returns: + + + + + + +@signer: +@created: + + + + + + +@signer: +@created: + + + + + + +@signer: +@email: + + + + + + +@signer: +@error: + + + + + + +@signer: +@expires: + + + + + + +@signer: +@expires: + + + + + + +@signer: +@fingerprint: + + + + + + +@signer: +@hash: + + + + + + +@signer: +@hash: + + + + + + +@signer: +@issuer_name: + + + + + + +@signer: +@issuer_serial: + + + + + + +@signer: +@created: + + + + + + +@signer: +@expires: + + + + + + +@signer: +@key_id: + + + + + + +@signer: +@name: + + + + + + +@signer: +@pubkey_algo: + + + + + + +@signer: +@sig_class: + + + + + + +@signer: +@created: + + + + + + +@signer: +@expires: + + + + + + +@signer: +@version: + + + + + + +@signer: +@status: + + + + + + +@signer: +@trust: + diff --git a/docs/reference/tmpl/gmime-utils.sgml b/docs/reference/tmpl/gmime-utils.sgml new file mode 100644 index 0000000..42b01bf --- /dev/null +++ b/docs/reference/tmpl/gmime-utils.sgml @@ -0,0 +1,240 @@ + +gmime-utils + + + + + + + + + + + + + + + + + + + + + + + + + +@next: +@msgid: + + + + + + +@str: +@tz_offset: +@Returns: + + + + + + + +@date: +@tz_offset: +@Returns: + + + + + + + +@fqdn: +@Returns: + + + + + + + +@message_id: +@Returns: + + + + + + + +@ref: +@Returns: + + + + + + + +@ref: +@Returns: + + + + + + + +@text: +@Returns: + + + + + + + +@refs: +@msgid: + + + + + + + +@refs: + + + + + + + +@refs: + + + + + + + +@str: +@Returns: + + + + + + + +@format: +@...: +@Returns: + + + + + + + +@str: +@Returns: + + + + + + + +@str: + + + + + + + +@text: +@len: +@Returns: + + + + + + + +@text: +@len: +@Returns: + + + + + + + +@text: +@len: +@Returns: + + + + + + + +@text: +@Returns: + + + + + + + +@text: +@Returns: + + + + + + + +@phrase: +@Returns: + + + + + + + +@phrase: +@Returns: + + + + + + + +@str: +@Returns: + + + + + + + +@str: +@Returns: + + diff --git a/docs/reference/tmpl/gmime.sgml b/docs/reference/tmpl/gmime.sgml new file mode 100644 index 0000000..dbf4f2a --- /dev/null +++ b/docs/reference/tmpl/gmime.sgml @@ -0,0 +1,131 @@ + +gmime + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@major: +@minor: +@micro: + + + + + + + + + + + + + + +@flags: + + + + + + + +@void: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@major: +@minor: +@micro: +@Returns: + + diff --git a/docs/reference/tmpl/internet-address-group.sgml b/docs/reference/tmpl/internet-address-group.sgml new file mode 100644 index 0000000..c738d96 --- /dev/null +++ b/docs/reference/tmpl/internet-address-group.sgml @@ -0,0 +1,65 @@ + +internet-address-group + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@name: +@Returns: + + + + + + + +@group: +@Returns: + + + + + + + +@group: +@members: + + + + + + + +@group: +@member: +@Returns: + + diff --git a/docs/reference/tmpl/internet-address-list.sgml b/docs/reference/tmpl/internet-address-list.sgml new file mode 100644 index 0000000..f2c7065 --- /dev/null +++ b/docs/reference/tmpl/internet-address-list.sgml @@ -0,0 +1,180 @@ + +internet-address-list + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@void: +@Returns: + + + + + + + +@list: +@Returns: + + + + + + + +@list: + + + + + + + +@list: +@ia: +@Returns: + + + + + + + +@list: +@index: +@ia: + + + + + + + +@list: +@ia: +@Returns: + + + + + + + +@list: +@index: +@Returns: + + + + + + + +@list: +@ia: +@Returns: + + + + + + + +@list: +@ia: +@Returns: + + + + + + + +@list: +@index: +@Returns: + + + + + + + +@list: +@index: +@ia: + + + + + + + +@list: +@prepend: + + + + + + + +@list: +@append: + + + + + + + +@list: +@encode: +@Returns: + + + + + + + +@str: +@Returns: + + + + + + + +@list: +@str: + + diff --git a/docs/reference/tmpl/internet-address-mailbox.sgml b/docs/reference/tmpl/internet-address-mailbox.sgml new file mode 100644 index 0000000..447d773 --- /dev/null +++ b/docs/reference/tmpl/internet-address-mailbox.sgml @@ -0,0 +1,56 @@ + +internet-address-mailbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@name: +@addr: +@Returns: + + + + + + + +@mailbox: +@Returns: + + + + + + + +@mailbox: +@addr: + + diff --git a/docs/reference/tmpl/internet-address.sgml b/docs/reference/tmpl/internet-address.sgml new file mode 100644 index 0000000..bc7912f --- /dev/null +++ b/docs/reference/tmpl/internet-address.sgml @@ -0,0 +1,56 @@ + +internet-address + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@ia: +@Returns: + + + + + + + +@ia: +@name: + + + + + + + +@ia: +@encode: +@Returns: + + diff --git a/docs/reference/tree_index.sgml b/docs/reference/tree_index.sgml new file mode 100644 index 0000000..6d2f0df --- /dev/null +++ b/docs/reference/tree_index.sgml @@ -0,0 +1,45 @@ + + GMimeHeader + GMimeParam + GObject + GMimeContentDisposition + GMimeContentType + GMimeDataWrapper + GMimeObject + GMimeMessage + GMimeMessagePart + GMimeMessagePartial + GMimeMultipart + GMimeMultipartEncrypted + GMimeMultipartSigned + GMimePart + GMimeParser + GMimeStream + GMimeStreamBuffer + GMimeStreamCat + GMimeStreamFile + GMimeStreamFilter + GMimeStreamFs + GMimeStreamMem + GMimeStreamMmap + GMimeStreamNull + GMimeFilter + GMimeFilterBasic + GMimeFilterBest + GMimeFilterCharset + GMimeFilterCRLF + GMimeFilterFrom + GMimeFilterGZip + GMimeFilterHTML + GMimeFilterMd5 + GMimeFilterStrip + GMimeFilterYenc + GMimeCipherContext + GMimeGpgContext + GMimeSession + GMimeSessionSimple + InternetAddress + InternetAddressGroup + InternetAddressMailbox + InternetAddressList + diff --git a/docs/tutorial/Makefile.am b/docs/tutorial/Makefile.am new file mode 100644 index 0000000..13e713d --- /dev/null +++ b/docs/tutorial/Makefile.am @@ -0,0 +1,24 @@ +.PHONY: html + +EXTRA_DIST = gmime-tut.sgml + +html: +if HAVE_DOCBOOK + if test -w $(srcdir); then \ + (cd $(srcdir); \ + $(DB2HTML) -o html gmime-tut.sgml); \ + fi +else + echo "***" + echo "*** Warning: Tutorial not built" + echo "***" +endif + +dist-hook: html +if HAVE_DOCBOOK + cp -Rp $(srcdir)/html $(distdir) +else + echo "*** DISTRIBUTION IS INCOMPLETE" + echo "***" +endif + diff --git a/docs/tutorial/Makefile.in b/docs/tutorial/Makefile.in new file mode 100644 index 0000000..e8763f9 --- /dev/null +++ b/docs/tutorial/Makefile.in @@ -0,0 +1,438 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = docs/tutorial +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +API_VERSION = @API_VERSION@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSC = @CSC@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GACUTIL = @GACUTIL@ +GAPI_CODEGEN = @GAPI_CODEGEN@ +GAPI_FIXUP = @GAPI_FIXUP@ +GAPI_PARSER = @GAPI_PARSER@ +GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@ +GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@ +GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TAR = @TAR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gacdir = @gacdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = gmime-tut.sgml +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/tutorial/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign docs/tutorial/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + dist-hook distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + uninstall uninstall-am + +.PHONY: html + +html: +@HAVE_DOCBOOK_TRUE@ if test -w $(srcdir); then \ +@HAVE_DOCBOOK_TRUE@ (cd $(srcdir); \ +@HAVE_DOCBOOK_TRUE@ $(DB2HTML) -o html gmime-tut.sgml); \ +@HAVE_DOCBOOK_TRUE@ fi +@HAVE_DOCBOOK_FALSE@ echo "***" +@HAVE_DOCBOOK_FALSE@ echo "*** Warning: Tutorial not built" +@HAVE_DOCBOOK_FALSE@ echo "***" + +dist-hook: html +@HAVE_DOCBOOK_TRUE@ cp -Rp $(srcdir)/html $(distdir) +@HAVE_DOCBOOK_FALSE@ echo "*** DISTRIBUTION IS INCOMPLETE" +@HAVE_DOCBOOK_FALSE@ echo "***" + +# 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/docs/tutorial/gmime-tut.sgml b/docs/tutorial/gmime-tut.sgml new file mode 100644 index 0000000..57b3c61 --- /dev/null +++ b/docs/tutorial/gmime-tut.sgml @@ -0,0 +1,681 @@ + + +]> + + + + GMime 2.6 tutorial + Oct 28, 2010 + + + Jeffrey + Stedfast + +
+ fejj@gnome.org +
+
+
+
+ + This tutorial is meant to demonstrate how to use the GMime + C API. + +
+ + + + + + Tutorial Availability + + A copy of this tutorial is distributed with each source-code +release of GMime in both SGML and HTML formats. For binary +distributions, please check with your vendor. + + An online version of this tutorial is also available at http://spruce.sourceforge.net/gmime/tutorial/. + + + + + + + Introduction + + GMime is a library for parsing and creating messages using the +Multipurpose Internet Mail Extension (MIME) format. It is licensed +under the GNU Lesser General +Public License (LGPL) so you are free to develop your Free +Software applications using GMime without having to spend anything for +licenses or royalties. + + The primary author and maintainer of GMime is: + + + + Jeffrey Stedfast fejj@gnome.org + + + + GMime is essentially an object-oriented application programmers +interface (API). Although written completely in C, it is implemented +using the idea of classes and callback functions (pointers to +functions). + + GMime is built upon another library called GLib which also +serves as the foundation for such libraries as the GIMP ToolKit +(Gtk+). GLib is mostly a portability layer but also contains +additional functionality such as hash tables, linked lists, etc. For +more information on GLib, you should see the API reference at http://library.gnome.org/devel/glib/stable/. + + + + + + Getting Started + + The first thing you need to do, of course, is download the +GMime source and install it. You can always get the latest version +from http://download.gnome.org/pub/GNOME/sources/gmime/. GMime +uses GNU autoconf for configuration. Once untar'd, type +./configure --help to see a list of options. + + More information about building GMime is available in either the +source distribution under docs/reference/ or via +the online reference at http://library.gnome.org/devel/gmime/stable/gmime-building.html. + + + + + + Getting Down to the Basics + + + + Compiling + + The first thing you need to learn how to do is compile + your program with the proper compiler flags so that your program + will include the correct GMime headers and linker flags. + + To compile and link a simple program, you'll want to do + the following: + + + + gcc -g -Wall -o simple simple.c `pkg-config --cflags --libs gmime-2.4` + + + + + + + GMimeStream Basics + + Before we get too deep into using GMime, it is important + to understand how to use the underlying I/O classes since GMime + is so very heavily dependant upon them. + + If you've looked at the API at all already, you will have + probably noticed that the stream functions work very much like + those of the standard low-level UNIX I/O functions (those that + use file descriptors) but with a few extras taken from the + higher-level Standard C I/O API. + + Let's take a moment to regres back to our early days of + programming where we learned how to write "Hello World!" on the + console: + + +#include <stdio.h> + +int main (int argc, char **argv) +{ + fprintf (stdout, "Hello World!\n"); + fflush (stdout); + + return 0; +} + + + Everyone should recognize what that program does. The + above program, rewritten to use GMime's stream classes would + look something like this: + + +#include <stdio.h> +#include <gmime/gmime.h> + +int main (int argc, char **argv) +{ + GMimeStream *stream; + + /* initialize GMime */ + g_mime_init (0); + + /* create a stream around stdout */ + stream = g_mime_stream_file_new (stdout); + + /* 'printf' */ + g_mime_stream_printf (stream, "Hello World!\n"); + + /* flush stdout */ + g_mime_stream_flush (stream); + + /* free/close the stream */ + g_object_unref (stream); + + return 0; +} + + + Hopefully, the only thing that may be new to you in either + of the above examples is the flushing of the stream after + writing to it. Most likely, in both examples, it is an unneeded + call, however it is there for completeness and you should + probably get into the habbit of flushing a stream after you've + finished writing to it. Like fflush(), g_mime_stream_flush() + will flush any write-buffers that the previous write-calls may + have left. + + The first function called in the second example is + g_mime_init with a value of + 0. If you haven't guessed, + g_mime_init initializes the GMime library. It + takes a single bit-mask argument specifying which options to + enable. Currently there is only one optional bit-flag, + GMIME_INIT_FLAG_UTF8 which is the default + anyway, so a value of 0 is used here. The + UTF-8 flag only exists for historical reasons. + + The only other line that should need explaining might be: + + + stream = g_mime_stream_file_new (stdout); + + + This line creates a new object of type GMimeStreamFile which + takes a FILE* argument. Once the + GMimeStreamFile is created, it takes ownership of the + FILE* so be careful if you want to be able to + ever use that FILE* handle again later in + your program or if you do not wish for it to be closed when the + GMimeStreamFile is closed later. + + One way of working around this is to do something like the + following example: + + +#include <stdio.h> +#include <unistd.h> +#include <gmime/gmime.h> + +int main (int argc, char **argv) +{ + GMimeStream *stream; + + /* initialize GMime */ + g_mime_init (0); + + /* create a stream around stdout */ + stream = g_mime_stream_fs_new (dup (fileno (stdout))); + + /* 'printf' */ + g_mime_stream_printf (stream, "Hello World!\n"); + + /* flush stdout */ + g_mime_stream_flush (stream); + + /* free/close the stream */ + g_object_unref (stream); + + return 0; +} + + + Here we have made a duplicate copy of stdout to give to + g_mime_stream_fs_new(). GMimeStreamFs is the + second type of stream meant for basic I/O, but instead of using + a FILE* handle, it instead uses an integer + file descriptor. The fileno() function + returns the integer file descriptor for a given + FILE* handle. The dup() + function makes a duplicate of the file descriptor passed to + it. More information can be read about these 2 functions by + using man on your local UNIX system or by + reading the Reference Manual for your libc. + + There are also some functions to tell GMimeStreamFile, + GMimeStreamFs and GMimeStreamMem that they are not the owners of + the backend storage and so when they are destroyed, they should + not close the file or free the memory buffer + (respectively). These functions are: + + +void g_mime_stream_file_set_owner (GMimeStreamFile *stream, gboolean owner); +void g_mime_stream_fs_set_owner (GMimeStreamFs *stream, gboolean owner); +void g_mime_stream_mem_set_owner (GMimeStreamMem *stream, gboolean owner); + + + Next, let's examine some of the other stream + functions. + + + g_mime_stream_eos (stream); + + + This function is useful for finding out if the + End-Of-Stream has been reached. This is similar in functionality + to Standard C's feof() function. + + + g_mime_stream_reset (stream); + + + This function will reset the state of a stream. Usually + this only means 'rewinding' to the beginning of the file. For + more complex streams, such as GMimeStreamFilter, however, this + will also reset the state of all of the filters that have been + attached to it (more on this later). + + + g_mime_stream_length (stream); + + + This function will return the length of the stream if + known, or -1 otherwise. For the most part, this function should + be avoided unless you absolutely need to know the stream length + and there is no other way to get it. The reason to avoid using + it is that it may be inaccurate if any filters are to be applied + as well as possibly being slow depending on the underlying + storage device. + + + g_mime_stream_substream (stream, start, end); + + + This function will return a substream of the original + stream, where the beginning of the new substream is the start + offset and the end is the end offset. These start and end + offsets MUST be within the bounds of the original + stream. Substreams can be useful if you want to only allow + reading and writing to a subsection of the original + stream. + + + g_mime_stream_read (stream, buf, n); + + + Like POSIX read(), this function will + try to read n bytes from the stream + into buf, but be warned that it is not + guaranteed to read the full requested buffer size if that much + data is not currently available. + + + g_mime_stream_write (stream, buf, n); + + + Like POSIX write() and standard + C's fwrite(), this function will write a + buffer of the specified length to the underlying + stream. However, unlike the POSIX write() + function, it will only fail if an irrecoverable error has + occurred and so it is not necessary to loop write attempts until + the entire buffer is written. + + + g_mime_stream_seek (stream, offset, GMIME_STREAM_SEEK_SET); + g_mime_stream_seek (stream, offset, GMIME_STREAM_SEEK_CUR); + g_mime_stream_seek (stream, offset, GMIME_STREAM_SEEK_END); + + + This function works exactly like the + POSIX lseek() or standard + C's fseek() functions. + + + + + + Stream Class Overview + + There are a number of stream classes included with GMime, + but we are only going to go over the more widely useful stream + classes. You should be able to figure out the others on your + own. + + We've already seen GMimeStreamFile and GMimeStreamFs in + action in the prevous chapter, so let's skip them and start with + GMimeStreamMem. + + GMimeStremMem is a stream abstraction that reads and + writes to a memory buffer. Like any other stream, the basic + stream functions (read, write, seek, substream, eos, etc) apply + here as well. Internally, GMimeStreamMem uses the GLib + GByteArray structure for storage so you may want to read up on + that. + + There are several ways to instantiate a GMimeStreamMem + object. You will probably use + g_mime_stream_mem_new() most of the + time. There may be times, however, when you will already have a + memory buffer that you'd like to use as a stream. There are + several ways to create a GMimeStreamMem object to use this + buffer (or a copy of it). + + The first is + g_mime_stream_mem_new_with_byte_array(). This + assumes that you are already using a GByteArray and want to use + it as a stream. As explained in the previous chapter about + GMimeStreamFile and ownership, the same applies here. When the + GMimeStreamMem is destroyed, so is the GByteArray structure and + the memory buffer it contained. To get around this, create a new + GMimeStreamMem object using + g_mime_stream_mem_new() and then use + g_mime_stream_mem_set_byte_array() to set the + GByteArray as the memory buffer. This will make it so that + GMimeStreamMem does not own the GByteArray, so when the + GMimeStremMem object is destroyed, the GByteArray will + remain. + + Also at your disposal for creating GMimeStreamMem objects + with an initial buffer is + g_mime_stream_mem_new_with_buffer(). This + function, however, will duplicate the buffer passed to it so if + you have memory quotas you are trying to keep, you may wish to + find a way to use one of the above methods. + + That pretty much sums up how to use GMimeStreamMem. The + next most widely used stream class is probably + GMimeStreamBuffer. This stream class actually wraps another + stream object adding additional functionality such as read and + write buffering and a few additional read methods. + + As you may or may not know, buffering reads and writes is + a great way to improve I/O performance in applications. The time + it takes to do a lot of small reads and writes accumulates + fast. + + When using a GMimeStreamBuffer in + GMIME_STREAM_BUFFER_BLOCK_READ mode, a block + of 4K (4096 bytes) will be read into an intermediate + buffer. Each time your application performs a read on this + GMimeStreamBuffer stream, a chunk of that intermediate buffer + will be copied to your read buffer until all 4K have been read, + at which point GMimeStreamBuffer will pre-scan the next 4K and so + on. + + Similarly, using mode + GMIME_STREAM_BUFFER_BLOCK_WRITE will copy + each of your application write-buffers into an intermediate 4K + buffer. When that 4K buffer fills up, it will be flushed to the + underlying stream. You may also use + g_mime_stream_flush() to force the + intermediate buffer to be written to the underlying + stream. + + Note that the intermediate buffer size is 4096 bytes. You + should be aware that if you will mostly be reading and writing + blocks of larger than 4K, it is probably best to avoid using + GMimeStreamBuffer as it will not likely gain you any performance + and may decrease performance instead. + + GMimeStreamBuffer also adds 2 convenience functions for + reading. While they will both work with any stream class, they + are obviously much faster if used with a GMimeStreamBuffer in + mode GMIME_STREAM_BUFFER_BLOCK_READ. These + functions are: + + +ssize_t g_mime_stream_buffer_gets (GMimeStream *stream, char *buf, size_t max); + +void g_mime_stream_buffer_readln (GMimeStream *stream, GByteArray *buffer); + + + The first function is similar to Standard C's + fgets() function (although the arguments are + in a slightly different order). It reads up to the first + max - 1 bytes, stopping after a + \n character, if found. buf + will always be nul-terminated. + + The second function, + g_mime_stream_buffer_readln(), has no + Standard C equivalent that I am aware of, but you should get the + idea of what it does based on the function name (I hope). It + reads exactly one (1) line (including the \n + character) and appends it to the end of + buffer. + + The last stream class you really need to know (and the + last one I have the patience to explain) is + GMimeStreamFilter. This is a special stream class which you can + attach GMimeFilters to so that reading/writing to this stream + will automagically convert the stream from one form to + another. GMime uses this stream internally for converting base64 + encoded attachments into their raw form and vice versa. + + + As previously mentioned in the last chapter concerning + g_mime_stream_reset(), resetting a + GMimeStreamFilter stream will also reset all of the filters + applied. + + + A great example usage of GMimeStreamFilter can be found in + the src/uuencode.c source file found in the + source distribution. Here's a clip of that source file + illustrating how to use stream filters: + + + GMimeStream *istream, *ostream, *fstream; + GMimeFilter *filter; + int fd; + + ... + + if (g_mime_stream_printf (ostream, "begin %.3o %s\n", st.st_mode & 0777, name) == -1) { + fprintf (stderr, "%s: %s\n", progname, strerror (errno)); + g_object_unref (ostream); + exit (1); + } + + istream = g_mime_stream_fs_new (fd); + + fstream = g_mime_stream_filter_new (ostream); + + filter = g_mime_filter_basic_new (GMIME_CONTENT_ENCODING_UUENCODE, TRUE); + g_mime_stream_filter_add ((GMimeStreamFilter *) fstream, filter); + g_object_unref (filter); + + if (g_mime_stream_write_to_stream (istream, fstream) == -1) { + fprintf (stderr, "%s: %s\n", progname, strerror (errno)); + g_object_unref (fstream); + g_object_unref (istream); + g_object_unref (ostream); + exit (1); + } + + g_mime_stream_flush (fstream); + g_object_unref (fstream); + g_object_unref (istream); + + if (g_mime_stream_write_string (ostream, "end\n") == -1) { + fprintf (stderr, "%s: %s\n", progname, strerror (errno)); + g_object_unref (ostream); + exit (1); + } + + g_object_unref (ostream); + + + The above snippet of code will read the contents of the input + stream (istream) and write it to our output + stream (ostream), but only after it has + passed through our filter-stream + (fstream). The filter attached to + fstream is one of the basic MIME filters that + encodes data in the traditional UUCP format. You have probably + run a program to do this many times in the past using the UNIX + command uuencode. Never thought writing a + replacement for uuencode could be so easy, + did you? Well, it is. And not only is it that + easy, but it also runs faster than the + uuencode shipped with GNU Sharutils (at least + up to and including the 4.2.1 release). + + + + + + Filter Class Overview + + GMime comes pre-bundled with a number of stream filters + for your convenience and more may be added in the future. For + now, let's breeze through a summary of some of the more important + ones: + + GMimeFilterBasic is used quite a lot internally in GMime + for encoding and decoding the content of MIME parts. This class + contains a mode for encoding and decoding each of Base64, + Quoted-Printable, and Uuencode. + + If you are interested in converting between charsets for + your users, you will likely want to become familiar with + GMimeFilterCharset which provides a convenient way to convert + text streams of one charset into another charset. + + GMimeFilterCRLF will likely become very useful to you if + you are implementing any internet standards or DOS/UNIX + compatability. This filter is meant for converting line endings + from the traditional UNIX sequence (LF) to the internet standard + (and DOS) sequence, CRLF, and vice versa. Also included in this + filter is a way to escape and unescape lines beginning with '.' + in the method used by the SMTP and POP protocols. + + GMimeFilterFrom is one you will likely need to use if ever + you need to write to an mbox-formatted mail spool. At present, + it has 2 modes: GMIME_FILTER_FROM_MODE_ESCAPE + and GMIME_FILTER_FROM_MODE_ARMOR. If you are + writing to an mbox-formatted spool, you will always want to use + the ESCAPE mode which will escape lines + beginning with "From " by prepending a '>' character, resulting + in ">From ". The other mode might come in handy if you are + implementing a multipart/signed method where you are + quoted-printable encoding a text stream and need to special-case + From-lines in order to protect against UNIX systems which will + alter the message when writing it to an mbox file such as the + previously mentioned filter mode. The result is something like + "=46rom " which prevents the need to prepend a '>' character + when the message arrives at a UNIX machine. + + Also included are: GMimeFilterBest (which will likely not + concern you), GMimeFilterEnriched (which will convert + text/enriched and/or text/rtf to text/html), and GMimeFilterHTML + which will convert text/plain into text/html with options to + wrap strings that appear to be hyperlinks with appropriate <a + href=...> tags; GMimeFilterStrip (again, likely this won't + concern you), and finally GMimeFilterYenc which will encode or + decode the YEncode encoding. + + For an example on how to use filters, please see the end + of the previous chapter where it talks about GMimeStreamFilter + and provides a snippet from + src/uuencode.c + + + Note: Since it may be non-obvious, filters are applied + to a stream in the same order that they are added to the + GMimeFilterStream. This means that if you add a base64 encode + filter and then add a CRLF filter, the stream will first be + base64 encoded and then the end-of-line formatting will be + canonicalised to CRLF. + + + + + + + + + MIME, MIME, and more MIME + + + + GMimePart + + Since most people seem to want to know how to "save an + attachment", let's start there. + + Given a GMimePart object, the first step to saving an + attachment is probably going to be figuring out what the + filename is. To do that, you'll likely want to do something + like: + + +static void +save_attachment (GMimePart *part) +{ + GMimeDataWrapper *content; + const char *filename; + GMimeStream *stream; + int fd; + + filename = g_mime_part_get_filename (part); + ... + + + The g_mime_part_get_filename() function + will first check for a filename parameter in + the Content-Disposition header. If that parameter exists, + it will return the value as the filename. However, if that does + not exist, it will fall back to checking for the + name parameter sometimes found in the + Content-Type header and return that value if it exists + (Microsoft Outlook, for example, will set the name parameter, + but will not set the filename parameter). If neither of these + param values are found, it will simply return + NULL. + + Now that you've got a filename for the MIME part (well, + assuming that it isn't NULL - in which case you'll have to + prompt the user or make up your own filename or something), the + next step is to open an output stream and write the MIME part's + content to disk: + + + ... + if ((fd = open (filename, O_CREAT | O_WRONLY, 0666)) == -1) + return; + + stream = g_mime_stream_fs_new (fd); + + content = g_mime_part_get_content_object (part); + g_mime_data_wrapper_write_to_stream (content, stream); + g_mime_stream_flush (stream); + g_object_unref (stream); +} + + + In order to get the content of a MIME part (eg. the body + of a part, not including the headers), you'll want to use + g_mime_part_get_content_object(). To write + the content object to a stream, you can use + g_mime_data_wrapper_write_to_stream(). On + fail, this function will return -1, otherwise + it will return some positive value which will usually equate to + the number of bytes written (but not always, due to filter + transformations); generally it's a good idea to not rely on the + returned value for anything other than error-checking. + + + + + +
diff --git a/gmime.pc.in b/gmime.pc.in new file mode 100644 index 0000000..de5b52f --- /dev/null +++ b/gmime.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + + +Name: GMime +Version: @VERSION@ +Description: MIME parser and utility library +Requires: glib-2.0,gio-2.0,gobject-2.0 +Libs: -L${libdir} @GMIME_LIBS@ +Libs.private: @GMIME_LIBS_PRIVATE@ +Cflags: -I${includedir}/gmime-@GMIME_API_VERSION@ @GMIME_CFLAGS@ diff --git a/gmime.spec b/gmime.spec new file mode 100644 index 0000000..55d03eb --- /dev/null +++ b/gmime.spec @@ -0,0 +1,109 @@ +# Note that this is NOT a relocatable package +%define ver 2.6.15 +%define prefix /usr +%define enable_mono 0 +%define enable_gtk_doc 0 + +%if %{enable_mono} +%define mono_configure_flags --enable-mono +%else +%define mono_configure_flags --disable-mono +%endif + +%if %{enable_gtk_doc} +%define gtkdoc_configure_flags --enable-gtk-doc +%else +%define gtkdoc_configure_flags --disable-gtk-doc +%endif + +Summary: MIME library +Name: gmime +Version: %ver +Release: 1 +Copyright: LGPL +Group: Development/Libraries +URL: http://spruce.sourceforge.net/gmime/ + +Source: ftp://ftp.gnome.org/pub/GNOME/sources/gmime/2.4/gmime-%{version}.tar.bz2 +BuildRoot: /var/tmp/%{name}-%{version}-%{release}-root + +Requires: glib2 >= 2.12.0 +BuildRequires: glib2-devel >= 2.12.0 + +%description +GMime is a set of utilities for parsing and creating messages using +the Multipurpose Internet Mail Extension (MIME) + +%if %{enable_mono} + +%package sharp +Summary: .NET bindings for GMime +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +BuildRequires: mono-core >= 2.0.0 +BuildRequires: gtk-sharp >= 2.4.0 +Requires: mono-core >= 2.0.0 +Requires: gtk-sharp >= 2.4.0 + +%description sharp +.NET Bindings for GMime + +%endif + +%prep +%setup + +%build +if [ ! -f configure ]; then + CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh $ARCHFLAG %{config_opts} %{mono_configure_flags} +fi +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix %{mono_configure_flags} +make + +%install +rm -rf $RPM_BUILD_ROOT +make install DESTDIR=${RPM_BUILD_ROOT} GACUTIL_FLAGS="/package gtk-sharp /root ${RPM_BUILD_ROOT}/usr/lib" + +# rename to prevent conflict with uu* utils from sharutils + +mv $RPM_BUILD_ROOT%{prefix}/bin/uuencode $RPM_BUILD_ROOT%{prefix}/bin/gmime-uuencode +mv $RPM_BUILD_ROOT%{prefix}/bin/uudecode $RPM_BUILD_ROOT%{prefix}/bin/gmime-uudecode + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-, root, root) + +%doc doc/html/* AUTHORS ChangeLog NEWS README COPYING TODO +%{prefix}/bin/* +%{prefix}/lib/*.sh +%{prefix}/lib/libgmime* +%{prefix}/lib/pkgconfig/* +%{prefix}/include/gmime-2.6/gmime/*.h +%if %{enable_gtk_doc} +%{_datadir}/gtk-doc/html/*/* +%endif + +%if %{enable_mono} + +%files sharp +%{prefix}/lib/mono/gmime-sharp/* +%{prefix}/lib/mono/gac/gmime-sharp/* +%{prefix}/share/gapi/gmime-api.xml + +%endif + +%changelog +* Mon Nov 29 2004 Ryan Skadberg +- Added in sharp package for .NET bindings + +* Wed Dec 9 2002 Benjamin Lee +- fixed sharutils conflict with uudecode and uuencode. +- removed duplicate libgmime inclusion in %files. + +* Wed Dec 4 2002 Benjamin Lee +- fixed files for gtk-doc, pkconfig, and includes. + +* Sat Mar 24 2001 Leland Elie +- created spec file. diff --git a/gmime.spec.in b/gmime.spec.in new file mode 100644 index 0000000..046f00b --- /dev/null +++ b/gmime.spec.in @@ -0,0 +1,109 @@ +# Note that this is NOT a relocatable package +%define ver @VERSION@ +%define prefix /usr +%define enable_mono 0 +%define enable_gtk_doc 0 + +%if %{enable_mono} +%define mono_configure_flags --enable-mono +%else +%define mono_configure_flags --disable-mono +%endif + +%if %{enable_gtk_doc} +%define gtkdoc_configure_flags --enable-gtk-doc +%else +%define gtkdoc_configure_flags --disable-gtk-doc +%endif + +Summary: MIME library +Name: gmime +Version: %ver +Release: 1 +Copyright: LGPL +Group: Development/Libraries +URL: http://spruce.sourceforge.net/gmime/ + +Source: ftp://ftp.gnome.org/pub/GNOME/sources/gmime/2.4/gmime-%{version}.tar.bz2 +BuildRoot: /var/tmp/%{name}-%{version}-%{release}-root + +Requires: glib2 >= 2.12.0 +BuildRequires: glib2-devel >= 2.12.0 + +%description +GMime is a set of utilities for parsing and creating messages using +the Multipurpose Internet Mail Extension (MIME) + +%if %{enable_mono} + +%package sharp +Summary: .NET bindings for GMime +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} +BuildRequires: mono-core >= 2.0.0 +BuildRequires: gtk-sharp >= 2.4.0 +Requires: mono-core >= 2.0.0 +Requires: gtk-sharp >= 2.4.0 + +%description sharp +.NET Bindings for GMime + +%endif + +%prep +%setup + +%build +if [ ! -f configure ]; then + CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh $ARCHFLAG %{config_opts} %{mono_configure_flags} +fi +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix %{mono_configure_flags} +make + +%install +rm -rf $RPM_BUILD_ROOT +make install DESTDIR=${RPM_BUILD_ROOT} GACUTIL_FLAGS="/package gtk-sharp /root ${RPM_BUILD_ROOT}/usr/lib" + +# rename to prevent conflict with uu* utils from sharutils + +mv $RPM_BUILD_ROOT%{prefix}/bin/uuencode $RPM_BUILD_ROOT%{prefix}/bin/gmime-uuencode +mv $RPM_BUILD_ROOT%{prefix}/bin/uudecode $RPM_BUILD_ROOT%{prefix}/bin/gmime-uudecode + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-, root, root) + +%doc doc/html/* AUTHORS ChangeLog NEWS README COPYING TODO +%{prefix}/bin/* +%{prefix}/lib/*.sh +%{prefix}/lib/libgmime* +%{prefix}/lib/pkgconfig/* +%{prefix}/include/gmime-2.6/gmime/*.h +%if %{enable_gtk_doc} +%{_datadir}/gtk-doc/html/*/* +%endif + +%if %{enable_mono} + +%files sharp +%{prefix}/lib/mono/gmime-sharp/* +%{prefix}/lib/mono/gac/gmime-sharp/* +%{prefix}/share/gapi/gmime-api.xml + +%endif + +%changelog +* Mon Nov 29 2004 Ryan Skadberg +- Added in sharp package for .NET bindings + +* Wed Dec 9 2002 Benjamin Lee +- fixed sharutils conflict with uudecode and uuencode. +- removed duplicate libgmime inclusion in %files. + +* Wed Dec 4 2002 Benjamin Lee +- fixed files for gtk-doc, pkconfig, and includes. + +* Sat Mar 24 2001 Leland Elie +- created spec file. diff --git a/gmime/Makefile.am b/gmime/Makefile.am new file mode 100644 index 0000000..65a5f7d --- /dev/null +++ b/gmime/Makefile.am @@ -0,0 +1,170 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = . + +gmimeincludedir = $(includedir)/gmime-$(GMIME_API_VERSION)/gmime + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/util \ + -DG_LOG_DOMAIN=\"gmime\" \ + $(GMIME_CFLAGS) \ + $(GLIB_CFLAGS) + +noinst_PROGRAMS = gen-table charset-map + +EXTRA_DIST = gmime-version.h.in gmime-version.h + +lib_LTLIBRARIES = libgmime-2.6.la + +libgmime_2_6_la_SOURCES = \ + gmime.c \ + gmime-certificate.c \ + gmime-charset.c \ + gmime-common.c \ + gmime-content-type.c \ + gmime-crypto-context.c \ + gmime-data-wrapper.c \ + gmime-disposition.c \ + gmime-encodings.c \ + gmime-events.c \ + gmime-filter.c \ + gmime-filter-basic.c \ + gmime-filter-best.c \ + gmime-filter-charset.c \ + gmime-filter-crlf.c \ + gmime-filter-enriched.c \ + gmime-filter-from.c \ + gmime-filter-gzip.c \ + gmime-filter-html.c \ + gmime-filter-md5.c \ + gmime-filter-strip.c \ + gmime-filter-windows.c \ + gmime-filter-yenc.c \ + gmime-gpg-context.c \ + gmime-header.c \ + gmime-iconv.c \ + gmime-iconv-utils.c \ + gmime-message.c \ + gmime-message-part.c \ + gmime-message-partial.c \ + gmime-multipart.c \ + gmime-multipart-encrypted.c \ + gmime-multipart-signed.c \ + gmime-object.c \ + gmime-param.c \ + gmime-parse-utils.c \ + gmime-parser.c \ + gmime-part.c \ + gmime-part-iter.c \ + gmime-pkcs7-context.c \ + gmime-signature.c \ + gmime-stream.c \ + gmime-stream-buffer.c \ + gmime-stream-cat.c \ + gmime-stream-file.c \ + gmime-stream-filter.c \ + gmime-stream-fs.c \ + gmime-stream-gio.c \ + gmime-stream-mem.c \ + gmime-stream-mmap.c \ + gmime-stream-null.c \ + gmime-stream-pipe.c \ + gmime-utils.c \ + internet-address.c + +gmimeinclude_HEADERS = \ + gmime.h \ + gmime-certificate.h \ + gmime-charset.h \ + gmime-content-type.h \ + gmime-crypto-context.h \ + gmime-data-wrapper.h \ + gmime-disposition.h \ + gmime-encodings.h \ + gmime-error.h \ + gmime-filter.h \ + gmime-filter-basic.h \ + gmime-filter-best.h \ + gmime-filter-charset.h \ + gmime-filter-crlf.h \ + gmime-filter-enriched.h \ + gmime-filter-from.h \ + gmime-filter-gzip.h \ + gmime-filter-html.h \ + gmime-filter-md5.h \ + gmime-filter-strip.h \ + gmime-filter-windows.h \ + gmime-filter-yenc.h \ + gmime-gpg-context.h \ + gmime-header.h \ + gmime-iconv.h \ + gmime-iconv-utils.h \ + gmime-message.h \ + gmime-message-part.h \ + gmime-message-partial.h \ + gmime-multipart.h \ + gmime-multipart-encrypted.h \ + gmime-multipart-signed.h \ + gmime-object.h \ + gmime-param.h \ + gmime-parser.h \ + gmime-part.h \ + gmime-part-iter.h \ + gmime-pkcs7-context.h \ + gmime-signature.h \ + gmime-stream.h \ + gmime-stream-buffer.h \ + gmime-stream-cat.h \ + gmime-stream-file.h \ + gmime-stream-filter.h \ + gmime-stream-fs.h \ + gmime-stream-gio.h \ + gmime-stream-mem.h \ + gmime-stream-mmap.h \ + gmime-stream-null.h \ + gmime-stream-pipe.h \ + gmime-utils.h \ + gmime-version.h \ + internet-address.h + +noinst_HEADERS = \ + gmime-charset-map-private.h \ + gmime-table-private.h \ + gmime-parse-utils.h \ + gmime-common.h \ + gmime-events.h + +install-data-local: install-libtool-import-lib + +uninstall-local: uninstall-libtool-import-lib + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +if OS_WIN32 +install-libtool-import-lib: + $(INSTALL) .libs/libgmime-$(GMIME_API_VERSION).dll.a $(DESTDIR)$(libdir) + +uninstall-libtool-import-lib: + -rm $(DESTDIR)$(libdir)/libgmime-$(GMIME_API_VERSION).dll.a +else +install-libtool-import-lib: +uninstall-libtool-import-lib: +endif + +libgmime_2_6_la_LIBADD = $(top_builddir)/util/libgmime-util.la $(GLIB_LIBS) +libgmime_2_6_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) + +gen_table_SOURCES = gen-table.c +gen_table_LDFLAGS = +gen_table_DEPENDENCIES = +gen_table_LDADD = + +charset_map_SOURCES = charset-map.c +charset_map_LDFLAGS = +charset_map_DEPENDENCIES = +charset_map_LDADD = $(top_builddir)/util/libgmime-util.la $(GLIB_LIBS) diff --git a/gmime/Makefile.in b/gmime/Makefile.in new file mode 100644 index 0000000..97f8a01 --- /dev/null +++ b/gmime/Makefile.in @@ -0,0 +1,1030 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +noinst_PROGRAMS = gen-table$(EXEEXT) charset-map$(EXEEXT) +subdir = gmime +DIST_COMMON = $(gmimeinclude_HEADERS) $(noinst_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/gmime-version.h.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = gmime-version.h +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(gmimeincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgmime_2_6_la_DEPENDENCIES = $(top_builddir)/util/libgmime-util.la \ + $(am__DEPENDENCIES_1) +am_libgmime_2_6_la_OBJECTS = gmime.lo gmime-certificate.lo \ + gmime-charset.lo gmime-common.lo gmime-content-type.lo \ + gmime-crypto-context.lo gmime-data-wrapper.lo \ + gmime-disposition.lo gmime-encodings.lo gmime-events.lo \ + gmime-filter.lo gmime-filter-basic.lo gmime-filter-best.lo \ + gmime-filter-charset.lo gmime-filter-crlf.lo \ + gmime-filter-enriched.lo gmime-filter-from.lo \ + gmime-filter-gzip.lo gmime-filter-html.lo gmime-filter-md5.lo \ + gmime-filter-strip.lo gmime-filter-windows.lo \ + gmime-filter-yenc.lo gmime-gpg-context.lo gmime-header.lo \ + gmime-iconv.lo gmime-iconv-utils.lo gmime-message.lo \ + gmime-message-part.lo gmime-message-partial.lo \ + gmime-multipart.lo gmime-multipart-encrypted.lo \ + gmime-multipart-signed.lo gmime-object.lo gmime-param.lo \ + gmime-parse-utils.lo gmime-parser.lo gmime-part.lo \ + gmime-part-iter.lo gmime-pkcs7-context.lo gmime-signature.lo \ + gmime-stream.lo gmime-stream-buffer.lo gmime-stream-cat.lo \ + gmime-stream-file.lo gmime-stream-filter.lo gmime-stream-fs.lo \ + gmime-stream-gio.lo gmime-stream-mem.lo gmime-stream-mmap.lo \ + gmime-stream-null.lo gmime-stream-pipe.lo gmime-utils.lo \ + internet-address.lo +libgmime_2_6_la_OBJECTS = $(am_libgmime_2_6_la_OBJECTS) +libgmime_2_6_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libgmime_2_6_la_LDFLAGS) $(LDFLAGS) -o $@ +PROGRAMS = $(noinst_PROGRAMS) +am_charset_map_OBJECTS = charset-map.$(OBJEXT) +charset_map_OBJECTS = $(am_charset_map_OBJECTS) +charset_map_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(charset_map_LDFLAGS) $(LDFLAGS) -o $@ +am_gen_table_OBJECTS = gen-table.$(OBJEXT) +gen_table_OBJECTS = $(am_gen_table_OBJECTS) +gen_table_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(gen_table_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgmime_2_6_la_SOURCES) $(charset_map_SOURCES) \ + $(gen_table_SOURCES) +DIST_SOURCES = $(libgmime_2_6_la_SOURCES) $(charset_map_SOURCES) \ + $(gen_table_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +HEADERS = $(gmimeinclude_HEADERS) $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +API_VERSION = @API_VERSION@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSC = @CSC@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GACUTIL = @GACUTIL@ +GAPI_CODEGEN = @GAPI_CODEGEN@ +GAPI_FIXUP = @GAPI_FIXUP@ +GAPI_PARSER = @GAPI_PARSER@ +GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@ +GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@ +GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TAR = @TAR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gacdir = @gacdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . +gmimeincludedir = $(includedir)/gmime-$(GMIME_API_VERSION)/gmime +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/util \ + -DG_LOG_DOMAIN=\"gmime\" \ + $(GMIME_CFLAGS) \ + $(GLIB_CFLAGS) + +EXTRA_DIST = gmime-version.h.in gmime-version.h +lib_LTLIBRARIES = libgmime-2.6.la +libgmime_2_6_la_SOURCES = \ + gmime.c \ + gmime-certificate.c \ + gmime-charset.c \ + gmime-common.c \ + gmime-content-type.c \ + gmime-crypto-context.c \ + gmime-data-wrapper.c \ + gmime-disposition.c \ + gmime-encodings.c \ + gmime-events.c \ + gmime-filter.c \ + gmime-filter-basic.c \ + gmime-filter-best.c \ + gmime-filter-charset.c \ + gmime-filter-crlf.c \ + gmime-filter-enriched.c \ + gmime-filter-from.c \ + gmime-filter-gzip.c \ + gmime-filter-html.c \ + gmime-filter-md5.c \ + gmime-filter-strip.c \ + gmime-filter-windows.c \ + gmime-filter-yenc.c \ + gmime-gpg-context.c \ + gmime-header.c \ + gmime-iconv.c \ + gmime-iconv-utils.c \ + gmime-message.c \ + gmime-message-part.c \ + gmime-message-partial.c \ + gmime-multipart.c \ + gmime-multipart-encrypted.c \ + gmime-multipart-signed.c \ + gmime-object.c \ + gmime-param.c \ + gmime-parse-utils.c \ + gmime-parser.c \ + gmime-part.c \ + gmime-part-iter.c \ + gmime-pkcs7-context.c \ + gmime-signature.c \ + gmime-stream.c \ + gmime-stream-buffer.c \ + gmime-stream-cat.c \ + gmime-stream-file.c \ + gmime-stream-filter.c \ + gmime-stream-fs.c \ + gmime-stream-gio.c \ + gmime-stream-mem.c \ + gmime-stream-mmap.c \ + gmime-stream-null.c \ + gmime-stream-pipe.c \ + gmime-utils.c \ + internet-address.c + +gmimeinclude_HEADERS = \ + gmime.h \ + gmime-certificate.h \ + gmime-charset.h \ + gmime-content-type.h \ + gmime-crypto-context.h \ + gmime-data-wrapper.h \ + gmime-disposition.h \ + gmime-encodings.h \ + gmime-error.h \ + gmime-filter.h \ + gmime-filter-basic.h \ + gmime-filter-best.h \ + gmime-filter-charset.h \ + gmime-filter-crlf.h \ + gmime-filter-enriched.h \ + gmime-filter-from.h \ + gmime-filter-gzip.h \ + gmime-filter-html.h \ + gmime-filter-md5.h \ + gmime-filter-strip.h \ + gmime-filter-windows.h \ + gmime-filter-yenc.h \ + gmime-gpg-context.h \ + gmime-header.h \ + gmime-iconv.h \ + gmime-iconv-utils.h \ + gmime-message.h \ + gmime-message-part.h \ + gmime-message-partial.h \ + gmime-multipart.h \ + gmime-multipart-encrypted.h \ + gmime-multipart-signed.h \ + gmime-object.h \ + gmime-param.h \ + gmime-parser.h \ + gmime-part.h \ + gmime-part-iter.h \ + gmime-pkcs7-context.h \ + gmime-signature.h \ + gmime-stream.h \ + gmime-stream-buffer.h \ + gmime-stream-cat.h \ + gmime-stream-file.h \ + gmime-stream-filter.h \ + gmime-stream-fs.h \ + gmime-stream-gio.h \ + gmime-stream-mem.h \ + gmime-stream-mmap.h \ + gmime-stream-null.h \ + gmime-stream-pipe.h \ + gmime-utils.h \ + gmime-version.h \ + internet-address.h + +noinst_HEADERS = \ + gmime-charset-map-private.h \ + gmime-table-private.h \ + gmime-parse-utils.h \ + gmime-common.h \ + gmime-events.h + +@PLATFORM_WIN32_TRUE@no_undefined = -no-undefined +libgmime_2_6_la_LIBADD = $(top_builddir)/util/libgmime-util.la $(GLIB_LIBS) +libgmime_2_6_la_LDFLAGS = \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ + -export-dynamic $(no_undefined) + +gen_table_SOURCES = gen-table.c +gen_table_LDFLAGS = +gen_table_DEPENDENCIES = +gen_table_LDADD = +charset_map_SOURCES = charset-map.c +charset_map_LDFLAGS = +charset_map_DEPENDENCIES = +charset_map_LDADD = $(top_builddir)/util/libgmime-util.la $(GLIB_LIBS) +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign gmime/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign gmime/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +gmime-version.h: $(top_builddir)/config.status $(srcdir)/gmime-version.h.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + 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 "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgmime-2.6.la: $(libgmime_2_6_la_OBJECTS) $(libgmime_2_6_la_DEPENDENCIES) $(EXTRA_libgmime_2_6_la_DEPENDENCIES) + $(libgmime_2_6_la_LINK) -rpath $(libdir) $(libgmime_2_6_la_OBJECTS) $(libgmime_2_6_la_LIBADD) $(LIBS) + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +charset-map$(EXEEXT): $(charset_map_OBJECTS) $(charset_map_DEPENDENCIES) $(EXTRA_charset_map_DEPENDENCIES) + @rm -f charset-map$(EXEEXT) + $(charset_map_LINK) $(charset_map_OBJECTS) $(charset_map_LDADD) $(LIBS) +gen-table$(EXEEXT): $(gen_table_OBJECTS) $(gen_table_DEPENDENCIES) $(EXTRA_gen_table_DEPENDENCIES) + @rm -f gen-table$(EXEEXT) + $(gen_table_LINK) $(gen_table_OBJECTS) $(gen_table_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/charset-map.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen-table.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-certificate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-charset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-content-type.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-crypto-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-data-wrapper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-disposition.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-encodings.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-events.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-basic.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-best.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-charset.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-crlf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-enriched.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-from.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-gzip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-html.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-md5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-strip.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-windows.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter-yenc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-filter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-gpg-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-header.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-iconv-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-iconv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-message-part.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-message-partial.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-message.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-multipart-encrypted.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-multipart-signed.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-multipart.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-param.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-parse-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-parser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-part-iter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-part.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-pkcs7-context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-signature.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-buffer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-cat.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-file.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-filter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-fs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-gio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-mem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-mmap.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-null.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream-pipe.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-stream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gmime.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/internet-address.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-gmimeincludeHEADERS: $(gmimeinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(gmimeincludedir)" || $(MKDIR_P) "$(DESTDIR)$(gmimeincludedir)" + @list='$(gmimeinclude_HEADERS)'; test -n "$(gmimeincludedir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(gmimeincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(gmimeincludedir)" || exit $$?; \ + done + +uninstall-gmimeincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(gmimeinclude_HEADERS)'; test -n "$(gmimeincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(gmimeincludedir)'; $(am__uninstall_files_from_dir) + +# 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): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + 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; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + 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; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +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; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$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; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + 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; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$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_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(gmimeincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-data-local install-gmimeincludeHEADERS + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-gmimeincludeHEADERS uninstall-libLTLIBRARIES \ + uninstall-local + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS ctags \ + ctags-recursive distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-dvi install-dvi-am \ + install-exec install-exec-am install-gmimeincludeHEADERS \ + install-html install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-gmimeincludeHEADERS uninstall-libLTLIBRARIES \ + uninstall-local + + +install-data-local: install-libtool-import-lib + +uninstall-local: uninstall-libtool-import-lib + +@OS_WIN32_TRUE@install-libtool-import-lib: +@OS_WIN32_TRUE@ $(INSTALL) .libs/libgmime-$(GMIME_API_VERSION).dll.a $(DESTDIR)$(libdir) + +@OS_WIN32_TRUE@uninstall-libtool-import-lib: +@OS_WIN32_TRUE@ -rm $(DESTDIR)$(libdir)/libgmime-$(GMIME_API_VERSION).dll.a +@OS_WIN32_FALSE@install-libtool-import-lib: +@OS_WIN32_FALSE@uninstall-libtool-import-lib: + +# 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/gmime/charset-map.c b/gmime/charset-map.c new file mode 100644 index 0000000..65e6de3 --- /dev/null +++ b/gmime/charset-map.c @@ -0,0 +1,283 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_CODESET +#include +#endif + + +static struct { + char *name; /* charset name */ + int multibyte; /* charset type */ + unsigned int bit; /* assigned bit */ +} tables[] = { + /* These are the 8bit character sets (other than iso-8859-1, + * which is special-cased) which are supported by both other + * mailers and the GNOME environment. Note that the order + * they're listed in is the order they'll be tried in, so put + * the more-popular ones first. + */ + { "iso-8859-2", 0, 0 }, /* Central/Eastern European */ + { "iso-8859-4", 0, 0 }, /* Baltic */ + { "koi8-r", 0, 0 }, /* Russian */ + { "koi8-u", 0, 0 }, /* Ukranian */ + { "iso-8859-5", 0, 0 }, /* Least-popular Russian encoding */ + { "iso-8859-6", 0, 0 }, /* Arabic */ + { "iso-8859-7", 0, 0 }, /* Greek */ + { "iso-8859-8", 0, 0 }, /* Hebrew; Visual */ + { "iso-8859-9", 0, 0 }, /* Turkish */ + { "iso-8859-13", 0, 0 }, /* Baltic again */ + { "iso-8859-15", 0, 0 }, /* New-and-improved iso-8859-1, but most + * programs that support this support UTF8 + */ + { "windows-1251", 0, 0 }, /* Russian */ + + /* These are the multibyte character sets which are commonly + * supported by other mail clients. Note: order for multibyte + * charsets does not affect priority unlike the 8bit charsets + * listed above. + */ + { "iso-2022-jp", 1, 0 }, /* Japanese designed for use over the Net */ + { "Shift-JIS", 1, 0 }, /* Japanese as used by Windows and MacOS systems */ + { "euc-jp", 1, 0 }, /* Japanese traditionally used on Unix systems */ + { "euc-kr", 1, 0 }, /* Korean */ + { "gb2312", 1, 0 }, /* Simplified Chinese */ + { "Big5", 1, 0 }, /* Traditional Chinese */ + { "euc-tw", 1, 0 }, + { NULL, 0, 0 } +}; + +unsigned int encoding_map[256 * 256]; + +#if G_BYTE_ORDER == G_BIG_ENDIAN +#define UCS "UCS-4BE" +#else +#define UCS "UCS-4LE" +#endif + +static guint +block_hash (gconstpointer v) +{ + const signed char *p = v; + guint32 h = *p++; + int i; + + for (i = 0; i < 256; i++) + h = (h << 5) - h + *p++; + + return h; +} + +static int +block_equal (gconstpointer v1, gconstpointer v2) +{ + return !memcmp (v1, v2, 256); +} + +int main (int argc, char **argv) +{ + unsigned char *block = NULL; + unsigned int bit = 0x01; + GHashTable *table_hash; + size_t inleft, outleft; + char *inbuf, *outbuf; + guint32 out[128], c; + unsigned int i; + char in[128]; + iconv_t cd; + int bytes; + int j, k; + + /* dont count the terminator */ + bytes = ((sizeof (tables) / sizeof (tables[0])) + 7 - 1) / 8; + g_assert (bytes <= 4); + + for (i = 0; i < 128; i++) + in[i] = i + 128; + + for (j = 0; tables[j].name && !tables[j].multibyte; j++) { + cd = iconv_open (UCS, tables[j].name); + inbuf = in; + inleft = sizeof (in); + outbuf = (char *) out; + outleft = sizeof (out); + while (iconv (cd, &inbuf, &inleft, &outbuf, &outleft) == (size_t) -1) { + if (errno == EILSEQ) { + inbuf++; + inleft--; + } else { + g_warning ("iconv (%s->UCS4, ..., %zu, ..., %zu): %s", + tables[j].name, inleft, outleft, + g_strerror (errno)); + exit (1); + } + } + iconv_close (cd); + + for (i = 0; i < 128 - outleft / 4; i++) { + encoding_map[i] |= bit; + encoding_map[out[i]] |= bit; + } + + tables[j].bit = bit; + bit <<= 1; + } + + /* Mutibyte tables */ + for ( ; tables[j].name && tables[j].multibyte; j++) { + cd = iconv_open (tables[j].name, UCS); + if (cd == (iconv_t) -1) + continue; + + for (c = 128, i = 0; c < 65535 && i < 65535; c++) { + inbuf = (char *) &c; + inleft = sizeof (c); + outbuf = in; + outleft = sizeof (in); + + if (iconv (cd, &inbuf, &inleft, &outbuf, &outleft) != (size_t) -1) { + /* this is a legal character in charset table[j].name */ + iconv (cd, NULL, NULL, &outbuf, &outleft); + encoding_map[i++] |= bit; + encoding_map[c] |= bit; + } else { + /* reset the iconv descriptor */ + iconv (cd, NULL, NULL, NULL, NULL); + } + } + + iconv_close (cd); + + tables[j].bit = bit; + bit <<= 1; + } + + printf ("/* This file is automatically generated: DO NOT EDIT */\n\n"); + + table_hash = g_hash_table_new_full (block_hash, block_equal, g_free, g_free); + + for (i = 0; i < 256; i++) { + for (k = 0; k < bytes; k++) { + char name[32], *alias; + int has_bits = FALSE; + + if (!block) { + /* we reuse malloc'd blocks that are not added to the + * hash table to avoid unnecessary malloc/free's */ + block = g_malloc (256); + } + + for (j = 0; j < 256; j++) { + if ((block[j] = (encoding_map[i * 256 + j] >> (k * 8)) & 0xff)) + has_bits = TRUE; + } + + if (!has_bits) + continue; + + sprintf (name, "m%02x%x", i, k); + + if ((alias = g_hash_table_lookup (table_hash, block))) { + /* this block is identical to an earlier block, just alias it */ + printf ("#define %s %s\n\n", name, alias); + } else { + /* unique block, dump it */ + g_hash_table_insert (table_hash, block, g_strdup (name)); + + printf ("static unsigned char %s[256] = {\n\t", name); + for (j = 0; j < 256; j++) { + printf ("0x%02x, ", block[j]); + if (((j + 1) & 7) == 0 && j < 255) + printf ("\n\t"); + } + printf ("\n};\n\n"); + + /* force the next loop to malloc a new block */ + block = NULL; + } + } + } + + g_hash_table_destroy (table_hash); + g_free (block); + + printf ("static const struct {\n"); + for (k = 0; k < bytes; k++) + printf ("\tunsigned char *bits%d;\n", k); + + printf ("} charmap[256] = {\n\t"); + for (i = 0; i < 256; i++) { + printf ("{ "); + for (k = 0; k < bytes; k++) { + for (j = 0; j < 256; j++) { + if ((encoding_map[i * 256 + j] & (0xff << (k * 8))) != 0) + break; + } + + if (j < 256) + printf ("m%02x%x, ", i, k); + else + printf ("NULL, "); + } + + printf ("}, "); + if (((i + 1) & 3) == 0 && i < 255) + printf ("\n\t"); + } + printf ("\n};\n\n"); + + printf ("static const struct {\n\tconst char *name;\n\tunsigned int bit;\n} charinfo[] = {\n"); + for (j = 0; tables[j].name; j++) + printf ("\t{ \"%s\", 0x%08x },\n", tables[j].name, tables[j].bit); + printf ("};\n\n"); + + printf ("#define charset_mask(x) \\\n"); + for (k = 0; k < bytes; k++) { + if (k != 0) + printf ("\t| "); + else + printf ("\t"); + + printf ("(charmap[(x) >> 8].bits%d ? charmap[(x) >> 8].bits%d[(x) & 0xff] << %d : 0)", + k, k, k * 8); + + if (k < bytes - 1) + printf ("\t\\\n"); + } + printf ("\n\n"); + + return 0; +} diff --git a/gmime/gen-table.c b/gmime/gen-table.c new file mode 100644 index 0000000..5c93e10 --- /dev/null +++ b/gmime/gen-table.c @@ -0,0 +1,212 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#include +#include +#include + +enum { + FALSE, + TRUE +}; + +#define CHARS_LWSP " \t\n\r" /* linear whitespace chars */ +#define CHARS_TSPECIAL "()<>@,;:\\\"/[]?=" +#define CHARS_SPECIAL "()<>@,;:\\\".[]" +#define CHARS_CSPECIAL "()\\\r" /* not in comments */ +#define CHARS_DSPECIAL "[]\\\r \t" /* not in domains */ +#define CHARS_ESPECIAL "()<>@,;:\"/[]?.=_" /* encoded word specials (rfc2047 5.1) */ +#define CHARS_PSPECIAL "!*+-/=_" /* encoded phrase specials (rfc2047 5.3) */ +#define CHARS_ATTRCHAR "*'% " /* attribute-char from rfc2184 */ + +static unsigned short gmime_special_table[256]; + +enum { + IS_CTRL = (1 << 0), + IS_LWSP = (1 << 1), + IS_TSPECIAL = (1 << 2), + IS_SPECIAL = (1 << 3), + IS_SPACE = (1 << 4), + IS_DSPECIAL = (1 << 5), + IS_QPSAFE = (1 << 6), + IS_ESAFE = (1 << 7), /* encoded word safe */ + IS_PSAFE = (1 << 8), /* encoded word in phrase safe */ + IS_ATTRCHAR = (1 << 9), /* attribute-char from rfc2184 */ + + /* ctype replacements */ + IS_ASCII = (1 << 10), /* ascii */ + IS_BLANK = (1 << 11), /* space or tab */ +}; + +#define is_ctrl(x) ((gmime_special_table[(unsigned char)(x)] & IS_CTRL) != 0) +#define is_lwsp(x) ((gmime_special_table[(unsigned char)(x)] & IS_LWSP) != 0) +#define is_tspecial(x) ((gmime_special_table[(unsigned char)(x)] & IS_TSPECIAL) != 0) +#define is_type(x, t) ((gmime_special_table[(unsigned char)(x)] & (t)) != 0) +#define is_ttoken(x) ((gmime_special_table[(unsigned char)(x)] & (IS_TSPECIAL|IS_LWSP|IS_CTRL)) == 0) +#define is_atom(x) ((gmime_special_table[(unsigned char)(x)] & (IS_SPECIAL|IS_SPACE|IS_CTRL)) == 0) +#define is_dtext(x) ((gmime_special_table[(unsigned char)(x)] & IS_DSPECIAL) == 0) +#define is_fieldname(x) ((gmime_special_table[(unsigned char)(x)] & (IS_CTRL|IS_SPACE)) == 0) +#define is_qpsafe(x) ((gmime_special_table[(unsigned char)(x)] & IS_QPSAFE) != 0) +#define is_especial(x) ((gmime_special_table[(unsigned char)(x)] & IS_ESAFE) != 0) +#define is_psafe(x) ((gmime_special_table[(unsigned char)(x)] & IS_PSAFE) != 0) +#define is_attrchar(x) ((gmime_special_table[(unsigned char)(x)] & IS_ATTRCHAR) != 0) + +/* ctype replacements */ +#define is_ascii(x) ((gmime_special_table[(unsigned char)(x)] & IS_ASCII) != 0) +#define is_blank(x) ((gmime_special_table[(unsigned char)(x)] & IS_BLANK) != 0) + +/* code to rebuild the gmime_special_table */ +static void +header_remove_bits (unsigned short bit, char *vals) +{ + register unsigned char *inptr = (unsigned char *) vals; + + while (*inptr != '\0') + gmime_special_table[*inptr++] &= ~bit; +} + +static void +header_init_bits (unsigned short bit, unsigned short bitcopy, int remove, char *vals) +{ + register unsigned char *inptr = (unsigned char *) vals; + int i; + + if (!remove) { + while (*inptr != '\0') + gmime_special_table[*inptr++] |= bit; + if (bitcopy) { + for (i = 0; i < 256; i++) { + if (gmime_special_table[i] & bitcopy) + gmime_special_table[i] |= bit; + } + } + } else { + for (i = 0; i < 256; i++) + gmime_special_table[i] |= bit; + while (*inptr != '\0') + gmime_special_table[*inptr++] &= ~bit; + if (bitcopy) { + for (i = 0; i < 256; i++) { + if (gmime_special_table[i] & bitcopy) + gmime_special_table[i] &= ~bit; + } + } + } +} + +static void +header_decode_init (void) +{ + int i; + + for (i = 0; i < 256; i++) { + gmime_special_table[i] = 0; + if (i < 32 || i == 127) + gmime_special_table[i] |= IS_CTRL; + if (i > 32 && i < 127) + gmime_special_table[i] |= IS_ATTRCHAR; + if ((i >= 33 && i <= 60) || (i >= 62 && i <= 126) || i == 32) + gmime_special_table[i] |= (IS_QPSAFE | IS_ESAFE); + if ((i >= '0' && i <= '9') || (i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z')) + gmime_special_table[i] |= IS_PSAFE; + if (isascii (i)) + gmime_special_table[i] |= IS_ASCII; + } + + gmime_special_table[' '] |= IS_SPACE | IS_BLANK; + gmime_special_table['\t'] |= IS_QPSAFE | IS_BLANK; + header_init_bits (IS_LWSP, 0, FALSE, CHARS_LWSP); + header_init_bits (IS_TSPECIAL, IS_CTRL, FALSE, CHARS_TSPECIAL); + header_init_bits (IS_SPECIAL, 0, FALSE, CHARS_SPECIAL); + header_init_bits (IS_DSPECIAL, 0, FALSE, CHARS_DSPECIAL); + header_remove_bits (IS_ESAFE, CHARS_ESPECIAL); + header_remove_bits (IS_ATTRCHAR, CHARS_TSPECIAL CHARS_ATTRCHAR); + header_init_bits (IS_PSAFE, 0, FALSE, CHARS_PSPECIAL); +} + +int main (int argc, char **argv) +{ + int i; + + header_decode_init (); + + printf ("/* THIS FILE IS AUTOGENERATED: DO NOT EDIT! */\n\n"); + printf ("/**\n * To regenerate:\n * make gen-table\n"); + printf (" * ./gen-table > gmime-table-private.h\n **/\n\n"); + + /* print out the table */ + printf ("static unsigned short gmime_special_table[256] = {"); + for (i = 0; i < 256; i++) { + printf ("%s%4d%s", (i % 16) ? "" : "\n\t", + gmime_special_table[i], i != 255 ? "," : "\n"); + } + printf ("};\n\n"); + + /* print out the enum */ + printf ("enum {\n"); + printf ("\tIS_CTRL = (1 << 0),\n"); + printf ("\tIS_LWSP = (1 << 1),\n"); + printf ("\tIS_TSPECIAL = (1 << 2),\n"); + printf ("\tIS_SPECIAL = (1 << 3),\n"); + printf ("\tIS_SPACE = (1 << 4),\n"); + printf ("\tIS_DSPECIAL = (1 << 5),\n"); + printf ("\tIS_QPSAFE = (1 << 6),\n"); + printf ("\tIS_ESAFE = (1 << 7), /* encoded word safe */\n"); + printf ("\tIS_PSAFE = (1 << 8), /* encode word in phrase safe */\n"); + printf ("\tIS_ATTRCHAR = (1 << 9), /* attribute-char from rfc2184 */\n"); + printf ("\t\n"); + printf ("\t/* ctype replacements */\n"); + printf ("\tIS_ASCII = (1 << 10), /* ascii */\n"); + printf ("\tIS_BLANK = (1 << 11), /* space or tab */\n"); + printf ("};\n\n"); + + printf ("#define is_ctrl(x) ((gmime_special_table[(unsigned char)(x)] & IS_CTRL) != 0)\n"); + printf ("#define is_lwsp(x) ((gmime_special_table[(unsigned char)(x)] & IS_LWSP) != 0)\n"); + printf ("#define is_tspecial(x) ((gmime_special_table[(unsigned char)(x)] & IS_TSPECIAL) != 0)\n"); + printf ("#define is_type(x, t) ((gmime_special_table[(unsigned char)(x)] & (t)) != 0)\n"); + printf ("#define is_ttoken(x) ((gmime_special_table[(unsigned char)(x)] & (IS_TSPECIAL|IS_LWSP|IS_CTRL)) == 0)\n"); + printf ("#define is_atom(x) ((gmime_special_table[(unsigned char)(x)] & (IS_SPECIAL|IS_SPACE|IS_CTRL)) == 0)\n"); + printf ("#define is_dtext(x) ((gmime_special_table[(unsigned char)(x)] & IS_DSPECIAL) == 0)\n"); + printf ("#define is_fieldname(x) ((gmime_special_table[(unsigned char)(x)] & (IS_CTRL|IS_SPACE)) == 0)\n"); + printf ("#define is_qpsafe(x) ((gmime_special_table[(unsigned char)(x)] & IS_QPSAFE) != 0)\n"); + printf ("#define is_especial(x) ((gmime_special_table[(unsigned char)(x)] & IS_ESAFE) != 0)\n"); + printf ("#define is_psafe(x) ((gmime_special_table[(unsigned char)(x)] & IS_PSAFE) != 0)\n"); + printf ("#define is_attrchar(x) ((gmime_special_table[(unsigned char)(x)] & IS_ATTRCHAR) != 0)\n"); + printf ("\n"); + printf ("/* ctype replacements */\n"); + printf ("#define is_ascii(x) ((gmime_special_table[(unsigned char)(x)] & IS_ASCII) != 0)\n"); + printf ("#define is_blank(x) ((gmime_special_table[(unsigned char)(x)] & IS_BLANK) != 0)\n"); + printf ("\n"); + + printf ("#define CHARS_LWSP \" \\t\\n\\r\" /* linear whitespace chars */\n"); + printf ("#define CHARS_TSPECIAL \"()<>@,;:\\\\\\\"/[]?=\"\n"); + printf ("#define CHARS_SPECIAL \"()<>@,;:\\\\\\\".[]\"\n"); + printf ("#define CHARS_CSPECIAL \"()\\\\\\r\" /* not in comments */\n"); + printf ("#define CHARS_DSPECIAL \"[]\\\\\\r \\t\" /* not in domains */\n"); + printf ("#define CHARS_ESPECIAL \"()<>@,;:\\\"/[]?.=_\" /* encoded word specials (rfc2047 5.1) */\n"); + printf ("#define CHARS_PSPECIAL \"!*+-/=_\" /* encoded phrase specials (rfc2047 5.3) */\n"); + printf ("#define CHARS_ATTRCHAR \"*'%% \" /* attribute-char from rfc2184 */\n"); + printf ("\n"); + + printf ("#define GMIME_FOLD_LEN 76\n"); + + return 0; +} diff --git a/gmime/gmime-certificate.c b/gmime/gmime-certificate.c new file mode 100644 index 0000000..8306dc8 --- /dev/null +++ b/gmime/gmime-certificate.c @@ -0,0 +1,840 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-certificate.h" + + +/** + * SECTION: gmime-certificate + * @title: GMimeCertificate + * @short_description: Digital certificates + * @see_also: + * + * A #GMimeCertificate is an object containing useful information about a + * digital certificate as used in signing and encrypting data. + **/ + + +static void g_mime_certificate_class_init (GMimeCertificateClass *klass); +static void g_mime_certificate_init (GMimeCertificate *cert, GMimeCertificateClass *klass); +static void g_mime_certificate_finalize (GObject *object); + +static GObjectClass *parent_class = NULL; + + +GType +g_mime_certificate_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeCertificateClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_certificate_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeCertificate), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_certificate_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeCertificate", &info, 0); + } + + return type; +} + +static void +g_mime_certificate_class_init (GMimeCertificateClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_certificate_finalize; +} + +static void +g_mime_certificate_init (GMimeCertificate *cert, GMimeCertificateClass *klass) +{ + cert->pubkey_algo = GMIME_PUBKEY_ALGO_DEFAULT; + cert->digest_algo = GMIME_DIGEST_ALGO_DEFAULT; + cert->trust = GMIME_CERTIFICATE_TRUST_NONE; + cert->issuer_serial = NULL; + cert->issuer_name = NULL; + cert->fingerprint = NULL; + cert->created = (time_t) -1; + cert->expires = (time_t) -1; + cert->keyid = NULL; + cert->email = NULL; + cert->name = NULL; +} + +static void +g_mime_certificate_finalize (GObject *object) +{ + GMimeCertificate *cert = (GMimeCertificate *) object; + + g_free (cert->issuer_serial); + g_free (cert->issuer_name); + g_free (cert->fingerprint); + g_free (cert->keyid); + g_free (cert->email); + g_free (cert->name); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +/** + * g_mime_certificate_new: + * + * Creates a new #GMimeCertificate object. + * + * Returns: a new #GMimeCertificate object. + **/ +GMimeCertificate * +g_mime_certificate_new (void) +{ + return g_object_newv (GMIME_TYPE_CERTIFICATE, 0, NULL); +} + + +/** + * g_mime_certificate_set_trust: + * @cert: a #GMimeCertificate + * @trust: a #GMimeCertificateTrust value + * + * Set the certificate trust. + **/ +void +g_mime_certificate_set_trust (GMimeCertificate *cert, GMimeCertificateTrust trust) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + cert->trust = trust; +} + + +/** + * g_mime_certificate_get_trust: + * @cert: a #GMimeCertificate + * + * Get the certificate trust. + * + * Returns: the certificate trust. + **/ +GMimeCertificateTrust +g_mime_certificate_get_trust (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), GMIME_CERTIFICATE_TRUST_NONE); + + return cert->trust; +} + + +/** + * g_mime_certificate_set_pubkey_algo: + * @cert: a #GMimeCertificate + * @algo: a #GMimePubKeyAlgo + * + * Set the public-key algorithm used by the certificate. + **/ +void +g_mime_certificate_set_pubkey_algo (GMimeCertificate *cert, GMimePubKeyAlgo algo) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + cert->pubkey_algo = algo; +} + + +/** + * g_mime_certificate_get_pubkey_algo: + * @cert: a #GMimeCertificate + * + * Get the public-key algorithm used by the certificate. + * + * Returns: the public-key algorithm used by the certificate or + * #GMIME_PUBKEY_ALGO_DEFAULT if unspecified. + **/ +GMimePubKeyAlgo +g_mime_certificate_get_pubkey_algo (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), GMIME_PUBKEY_ALGO_DEFAULT); + + return cert->pubkey_algo; +} + + +/** + * g_mime_certificate_set_digest_algo: + * @cert: a #GMimeCertificate + * @algo: a #GMimeDigestAlgo + * + * Set the digest algorithm used by the certificate. + **/ +void +g_mime_certificate_set_digest_algo (GMimeCertificate *cert, GMimeDigestAlgo algo) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + cert->digest_algo = algo; +} + + +/** + * g_mime_certificate_get_digest_algo: + * @cert: a #GMimeCertificate + * + * Get the digest algorithm used by the certificate. + * + * Returns: the digest algorithm used by the certificate or + * #GMIME_DIGEST_ALGO_DEFAULT if unspecified. + **/ +GMimeDigestAlgo +g_mime_certificate_get_digest_algo (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), GMIME_DIGEST_ALGO_DEFAULT); + + return cert->digest_algo; +} + + +/** + * g_mime_certificate_set_issuer_serial: + * @cert: a #GMimeCertificate + * @issuer_serial: certificate's issuer serial + * + * Set the certificate's issuer serial. + **/ +void +g_mime_certificate_set_issuer_serial (GMimeCertificate *cert, const char *issuer_serial) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + g_free (cert->issuer_serial); + cert->issuer_serial = g_strdup (issuer_serial); +} + + +/** + * g_mime_certificate_get_issuer_serial: + * @cert: a #GMimeCertificate + * + * Get the certificate's issuer serial. + * + * Returns: the certificate's issuer serial or %NULL if unspecified. + **/ +const char * +g_mime_certificate_get_issuer_serial (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), NULL); + + return cert->issuer_serial; +} + + +/** + * g_mime_certificate_set_issuer_name: + * @cert: a #GMimeCertificate + * @issuer_name: certificate's issuer name + * + * Set the certificate's issuer name. + **/ +void +g_mime_certificate_set_issuer_name (GMimeCertificate *cert, const char *issuer_name) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + g_free (cert->issuer_name); + cert->issuer_name = g_strdup (issuer_name); +} + + +/** + * g_mime_certificate_get_issuer_name: + * @cert: a #GMimeCertificate + * + * Get the certificate's issuer name. + * + * Returns: the certificate's issuer name or %NULL if unspecified. + **/ +const char * +g_mime_certificate_get_issuer_name (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), NULL); + + return cert->issuer_name; +} + + +/** + * g_mime_certificate_set_fingerprint: + * @cert: a #GMimeCertificate + * @fingerprint: fingerprint string + * + * Set the certificate's key fingerprint. + **/ +void +g_mime_certificate_set_fingerprint (GMimeCertificate *cert, const char *fingerprint) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + g_free (cert->fingerprint); + cert->fingerprint = g_strdup (fingerprint); +} + + +/** + * g_mime_certificate_get_fingerprint: + * @cert: a #GMimeCertificate + * + * Get the certificate's key fingerprint. + * + * Returns: the certificate's key fingerprint or %NULL if unspecified. + **/ +const char * +g_mime_certificate_get_fingerprint (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), NULL); + + return cert->fingerprint; +} + + +/** + * g_mime_certificate_set_key_id: + * @cert: a #GMimeCertificate + * @key_id: key id + * + * Set the certificate's key id. + **/ +void +g_mime_certificate_set_key_id (GMimeCertificate *cert, const char *key_id) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + g_free (cert->keyid); + cert->keyid = g_strdup (key_id); +} + + +/** + * g_mime_certificate_get_key_id: + * @cert: a #GMimeCertificate + * + * Get the certificate's key id. + * + * Returns: the certificate's key id or %NULL if unspecified. + **/ +const char * +g_mime_certificate_get_key_id (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), NULL); + + return cert->keyid; +} + + +/** + * g_mime_certificate_set_email: + * @cert: a #GMimeCertificate + * @email: certificate's email + * + * Set the certificate's email. + **/ +void +g_mime_certificate_set_email (GMimeCertificate *cert, const char *email) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + g_free (cert->email); + cert->email = g_strdup (email); +} + + +/** + * g_mime_certificate_get_email: + * @cert: a #GMimeCertificate + * + * Get the certificate's email. + * + * Returns: the certificate's email or %NULL if unspecified. + **/ +const char * +g_mime_certificate_get_email (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), NULL); + + return cert->email; +} + + +/** + * g_mime_certificate_set_name: + * @cert: a #GMimeCertificate + * @name: certificate's name + * + * Set the certificate's name. + **/ +void +g_mime_certificate_set_name (GMimeCertificate *cert, const char *name) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + g_free (cert->name); + cert->name = g_strdup (name); +} + + +/** + * g_mime_certificate_get_name: + * @cert: a #GMimeCertificate + * + * Get the certificate's name. + * + * Returns: the certificate's name or %NULL if unspecified. + **/ +const char * +g_mime_certificate_get_name (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), NULL); + + return cert->name; +} + + +/** + * g_mime_certificate_set_created: + * @cert: a #GMimeCertificate + * @created: creation date + * + * Set the creation date of the certificate's key. + **/ +void +g_mime_certificate_set_created (GMimeCertificate *cert, time_t created) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + cert->created = created; +} + + +/** + * g_mime_certificate_get_created: + * @cert: a #GMimeCertificate + * + * Get the creation date of the certificate's key. + * + * Returns: the creation date of the certificate's key or %-1 if unknown. + **/ +time_t +g_mime_certificate_get_created (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), (time_t) -1); + + return cert->created; +} + + +/** + * g_mime_certificate_set_expires: + * @cert: a #GMimeCertificate + * @expires: expiration date + * + * Set the expiration date of the certificate's key. + **/ +void +g_mime_certificate_set_expires (GMimeCertificate *cert, time_t expires) +{ + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + cert->expires = expires; +} + + +/** + * g_mime_certificate_get_expires: + * @cert: a #GMimeCertificate + * + * Get the expiration date of the certificate's key. + * + * Returns: the expiration date of the certificate's key or %-1 if unknown. + **/ +time_t +g_mime_certificate_get_expires (GMimeCertificate *cert) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), (time_t) -1); + + return cert->expires; +} + + +static void g_mime_certificate_list_class_init (GMimeCertificateListClass *klass); +static void g_mime_certificate_list_init (GMimeCertificateList *list, GMimeCertificateListClass *klass); +static void g_mime_certificate_list_finalize (GObject *object); + + +static GObjectClass *list_parent_class = NULL; + + +GType +g_mime_certificate_list_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeCertificateListClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_certificate_list_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeCertificateList), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_certificate_list_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeCertificateList", &info, 0); + } + + return type; +} + + +static void +g_mime_certificate_list_class_init (GMimeCertificateListClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + list_parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_certificate_list_finalize; +} + +static void +g_mime_certificate_list_init (GMimeCertificateList *list, GMimeCertificateListClass *klass) +{ + list->array = g_ptr_array_new (); +} + +static void +g_mime_certificate_list_finalize (GObject *object) +{ + GMimeCertificateList *list = (GMimeCertificateList *) object; + GMimeCertificate *cert; + guint i; + + for (i = 0; i < list->array->len; i++) { + cert = (GMimeCertificate *) list->array->pdata[i]; + g_object_unref (cert); + } + + g_ptr_array_free (list->array, TRUE); + + G_OBJECT_CLASS (list_parent_class)->finalize (object); +} + + +/** + * g_mime_certificate_list_new: + * + * Creates a new #GMimeCertificateList. + * + * Returns: a new #GMimeCertificateList. + **/ +GMimeCertificateList * +g_mime_certificate_list_new (void) +{ + return g_object_newv (GMIME_TYPE_CERTIFICATE_LIST, 0, NULL); +} + + +/** + * g_mime_certificate_list_length: + * @list: a #GMimeCertificateList + * + * Gets the length of the list. + * + * Returns: the number of #GMimeCertificate objects in the list. + **/ +int +g_mime_certificate_list_length (GMimeCertificateList *list) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE_LIST (list), -1); + + return list->array->len; +} + + +/** + * g_mime_certificate_list_clear: + * @list: a #GMimeCertificateList + * + * Clears the list of addresses. + **/ +void +g_mime_certificate_list_clear (GMimeCertificateList *list) +{ + GMimeCertificate *cert; + guint i; + + g_return_if_fail (GMIME_IS_CERTIFICATE_LIST (list)); + + for (i = 0; i < list->array->len; i++) { + cert = (GMimeCertificate *) list->array->pdata[i]; + g_object_unref (cert); + } + + g_ptr_array_set_size (list->array, 0); +} + + +/** + * g_mime_certificate_list_add: + * @list: a #GMimeCertificateList + * @cert: a #GMimeCertificate + * + * Adds a #GMimeCertificate to the #GMimeCertificateList. + * + * Returns: the index of the added #GMimeCertificate. + **/ +int +g_mime_certificate_list_add (GMimeCertificateList *list, GMimeCertificate *cert) +{ + int index; + + g_return_val_if_fail (GMIME_IS_CERTIFICATE_LIST (list), -1); + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), -1); + + index = list->array->len; + g_ptr_array_add (list->array, cert); + g_object_ref (cert); + + return index; +} + + +/** + * g_mime_certificate_list_insert: + * @list: a #GMimeCertificateList + * @index: index to insert at + * @cert: a #GMimeCertificate + * + * Inserts a #GMimeCertificate into the #GMimeCertificateList at the specified + * index. + **/ +void +g_mime_certificate_list_insert (GMimeCertificateList *list, int index, GMimeCertificate *cert) +{ + char *dest, *src; + size_t n; + + g_return_if_fail (GMIME_IS_CERTIFICATE_LIST (list)); + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + g_return_if_fail (index >= 0); + + if ((guint) index < list->array->len) { + g_ptr_array_set_size (list->array, list->array->len + 1); + + dest = ((char *) list->array->pdata) + (sizeof (void *) * (index + 1)); + src = ((char *) list->array->pdata) + (sizeof (void *) * index); + n = list->array->len - index - 1; + + g_memmove (dest, src, (sizeof (void *) * n)); + list->array->pdata[index] = cert; + } else { + /* the easy case */ + g_ptr_array_add (list->array, cert); + } + + g_object_ref (cert); +} + + +/** + * g_mime_certificate_list_remove: + * @list: a #GMimeCertificateList + * @cert: a #GMimeCertificate + * + * Removes a #GMimeCertificate from the #GMimeCertificateList. + * + * Returns: %TRUE if the specified #GMimeCertificate was removed or %FALSE + * otherwise. + **/ +gboolean +g_mime_certificate_list_remove (GMimeCertificateList *list, GMimeCertificate *cert) +{ + int index; + + g_return_val_if_fail (GMIME_IS_CERTIFICATE_LIST (list), FALSE); + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), FALSE); + + if ((index = g_mime_certificate_list_index_of (list, cert)) == -1) + return FALSE; + + g_mime_certificate_list_remove_at (list, index); + + return TRUE; +} + + +/** + * g_mime_certificate_list_remove_at: + * @list: a #GMimeCertificateList + * @index: index to remove + * + * Removes a #GMimeCertificate from the #GMimeCertificateList at the specified + * index. + * + * Returns: %TRUE if an #GMimeCertificate was removed or %FALSE otherwise. + **/ +gboolean +g_mime_certificate_list_remove_at (GMimeCertificateList *list, int index) +{ + GMimeCertificate *cert; + + g_return_val_if_fail (GMIME_IS_CERTIFICATE_LIST (list), FALSE); + g_return_val_if_fail (index >= 0, FALSE); + + if ((guint) index >= list->array->len) + return FALSE; + + cert = list->array->pdata[index]; + g_ptr_array_remove_index (list->array, index); + g_object_unref (cert); + + return TRUE; +} + + +/** + * g_mime_certificate_list_contains: + * @list: a #GMimeCertificateList + * @cert: a #GMimeCertificate + * + * Checks whether or not the specified #GMimeCertificate is contained within + * the #GMimeCertificateList. + * + * Returns: %TRUE if the specified #GMimeCertificate is contained within the + * specified #GMimeCertificateList or %FALSE otherwise. + **/ +gboolean +g_mime_certificate_list_contains (GMimeCertificateList *list, GMimeCertificate *cert) +{ + return g_mime_certificate_list_index_of (list, cert) != -1; +} + + +/** + * g_mime_certificate_list_index_of: + * @list: a #GMimeCertificateList + * @cert: a #GMimeCertificate + * + * Gets the index of the specified #GMimeCertificate inside the + * #GMimeCertificateList. + * + * Returns: the index of the requested #GMimeCertificate within the + * #GMimeCertificateList or %-1 if it is not contained within the + * #GMimeCertificateList. + **/ +int +g_mime_certificate_list_index_of (GMimeCertificateList *list, GMimeCertificate *cert) +{ + guint i; + + g_return_val_if_fail (GMIME_IS_CERTIFICATE_LIST (list), -1); + g_return_val_if_fail (GMIME_IS_CERTIFICATE (cert), -1); + + for (i = 0; i < list->array->len; i++) { + if (list->array->pdata[i] == cert) + return i; + } + + return -1; +} + + +/** + * g_mime_certificate_list_get_certificate: + * @list: a #GMimeCertificateList + * @index: index of #GMimeCertificate to get + * + * Gets the #GMimeCertificate at the specified index. + * + * Returns: the #GMimeCertificate at the specified index or %NULL if + * the index is out of range. + **/ +GMimeCertificate * +g_mime_certificate_list_get_certificate (GMimeCertificateList *list, int index) +{ + g_return_val_if_fail (GMIME_IS_CERTIFICATE_LIST (list), NULL); + g_return_val_if_fail (index >= 0, NULL); + + if ((guint) index >= list->array->len) + return NULL; + + return list->array->pdata[index]; +} + + +/** + * g_mime_certificate_list_set_certificate: + * @list: a #GMimeCertificateList + * @index: index of #GMimeCertificate to set + * @cert: a #GMimeCertificate + * + * Sets the #GMimeCertificate at the specified index to @cert. + **/ +void +g_mime_certificate_list_set_certificate (GMimeCertificateList *list, int index, GMimeCertificate *cert) +{ + GMimeCertificate *old; + + g_return_if_fail (GMIME_IS_CERTIFICATE_LIST (list)); + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + g_return_if_fail (index >= 0); + + if ((guint) index > list->array->len) + return; + + if ((guint) index == list->array->len) { + g_mime_certificate_list_add (list, cert); + return; + } + + if ((old = list->array->pdata[index]) == cert) + return; + + list->array->pdata[index] = cert; + g_object_unref (old); + g_object_ref (cert); +} diff --git a/gmime/gmime-certificate.h b/gmime/gmime-certificate.h new file mode 100644 index 0000000..d154e4c --- /dev/null +++ b/gmime/gmime-certificate.h @@ -0,0 +1,244 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_CERTIFICATE_H__ +#define __GMIME_CERTIFICATE_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_CERTIFICATE (g_mime_certificate_get_type ()) +#define GMIME_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_CERTIFICATE, GMimeCertificate)) +#define GMIME_CERTIFICATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_CERTIFICATE, GMimeCertificateClass)) +#define GMIME_IS_CERTIFICATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_CERTIFICATE)) +#define GMIME_IS_CERTIFICATE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_CERTIFICATE)) +#define GMIME_CERTIFICATE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_CERTIFICATE, GMimeCertificateClass)) + +#define GMIME_TYPE_CERTIFICATE_LIST (g_mime_certificate_list_get_type ()) +#define GMIME_CERTIFICATE_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_CERTIFICATE_LIST, GMimeCertificateList)) +#define GMIME_CERTIFICATE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_CERTIFICATE_LIST, GMimeCertificateListClass)) +#define GMIME_IS_CERTIFICATE_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_CERTIFICATE_LIST)) +#define GMIME_IS_CERTIFICATE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_CERTIFICATE_LIST)) +#define GMIME_CERTIFICATE_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_CERTIFICATE_LIST, GMimeCertificateListClass)) + + +typedef struct _GMimeCertificate GMimeCertificate; +typedef struct _GMimeCertificateClass GMimeCertificateClass; + +typedef struct _GMimeCertificateList GMimeCertificateList; +typedef struct _GMimeCertificateListClass GMimeCertificateListClass; + + +/** + * GMimeDigestAlgo: + * @GMIME_DIGEST_ALGO_DEFAULT: The default hash algorithm. + * @GMIME_DIGEST_ALGO_MD5: The MD5 hash algorithm. + * @GMIME_DIGEST_ALGO_SHA1: The SHA-1 hash algorithm. + * @GMIME_DIGEST_ALGO_RIPEMD160: The RIPEMD-160 hash algorithm. + * @GMIME_DIGEST_ALGO_MD2: The MD2 hash algorithm. + * @GMIME_DIGEST_ALGO_TIGER192: The TIGER-192 hash algorithm. + * @GMIME_DIGEST_ALGO_HAVAL5160: The HAVAL-5-160 hash algorithm. + * @GMIME_DIGEST_ALGO_SHA256: The SHA-256 hash algorithm. + * @GMIME_DIGEST_ALGO_SHA384: The SHA-384 hash algorithm. + * @GMIME_DIGEST_ALGO_SHA512: The SHA-512 hash algorithm. + * @GMIME_DIGEST_ALGO_SHA224: The SHA-224 hash algorithm. + * @GMIME_DIGEST_ALGO_MD4: The MD4 hash algorithm. + * + * A hash algorithm. + **/ +typedef enum { + GMIME_DIGEST_ALGO_DEFAULT = 0, + GMIME_DIGEST_ALGO_MD5 = 1, + GMIME_DIGEST_ALGO_SHA1 = 2, + GMIME_DIGEST_ALGO_RIPEMD160 = 3, + GMIME_DIGEST_ALGO_MD2 = 5, + GMIME_DIGEST_ALGO_TIGER192 = 6, + GMIME_DIGEST_ALGO_HAVAL5160 = 7, + GMIME_DIGEST_ALGO_SHA256 = 8, + GMIME_DIGEST_ALGO_SHA384 = 9, + GMIME_DIGEST_ALGO_SHA512 = 10, + GMIME_DIGEST_ALGO_SHA224 = 11, + GMIME_DIGEST_ALGO_MD4 = 301 +} GMimeDigestAlgo; + +/** + * GMimePubKeyAlgo: + * @GMIME_PUBKEY_ALGO_DEFAULT: The default public-key algorithm. + * @GMIME_PUBKEY_ALGO_RSA: The RSA algorithm. + * @GMIME_PUBKEY_ALGO_RSA_E: An encryption-only RSA algorithm. + * @GMIME_PUBKEY_ALGO_RSA_S: A signature-only RSA algorithm. + * @GMIME_PUBKEY_ALGO_ELG_E: An encryption-only ElGamal algorithm. + * @GMIME_PUBKEY_ALGO_DSA: The DSA algorithm. + * @GMIME_PUBKEY_ALGO_ELG: The ElGamal algorithm. + * + * A public-key algorithm. + **/ +typedef enum { + GMIME_PUBKEY_ALGO_DEFAULT = 0, + GMIME_PUBKEY_ALGO_RSA = 1, + GMIME_PUBKEY_ALGO_RSA_E = 2, + GMIME_PUBKEY_ALGO_RSA_S = 3, + GMIME_PUBKEY_ALGO_ELG_E = 16, + GMIME_PUBKEY_ALGO_DSA = 17, + GMIME_PUBKEY_ALGO_ELG = 20 +} GMimePubKeyAlgo; + +/** + * GMimeCertificateTrust: + * @GMIME_CERTIFICATE_TRUST_NONE: No trust assigned. + * @GMIME_CERTIFICATE_TRUST_NEVER: Never trust this certificate. + * @GMIME_CERTIFICATE_TRUST_UNDEFINED: Undefined trust for this certificate. + * @GMIME_CERTIFICATE_TRUST_MARGINAL: Trust this certificate maginally. + * @GMIME_CERTIFICATE_TRUST_FULLY: Trust this certificate fully. + * @GMIME_CERTIFICATE_TRUST_ULTIMATE: Trust this certificate ultimately. + * + * The trust value of a certificate. + **/ +typedef enum { + GMIME_CERTIFICATE_TRUST_NONE, + GMIME_CERTIFICATE_TRUST_NEVER, + GMIME_CERTIFICATE_TRUST_UNDEFINED, + GMIME_CERTIFICATE_TRUST_MARGINAL, + GMIME_CERTIFICATE_TRUST_FULLY, + GMIME_CERTIFICATE_TRUST_ULTIMATE +} GMimeCertificateTrust; + +/** + * GMimeCertificate: + * @parent_object: parent #GObject + * @pubkey_algo: The public-key algorithm used by the certificate, if known. + * @digest_algo: The digest algorithm used by the certificate, if known. + * @trust: The level of trust assigned to this certificate. + * @issuer_serial: The issuer of the certificate, if known. + * @issuer_name: The issuer of the certificate, if known. + * @fingerprint: A hex string representing the certificate's fingerprint. + * @created: The creation date of the certificate. + * @expires: The expiration date of the certificate. + * @keyid: The certificate's key id. + * @email: The email address of the person or entity. + * @name: The name of the person or entity. + * + * An object containing useful information about a certificate. + **/ +struct _GMimeCertificate { + GObject parent_object; + + GMimePubKeyAlgo pubkey_algo; + GMimeDigestAlgo digest_algo; + GMimeCertificateTrust trust; + char *issuer_serial; + char *issuer_name; + char *fingerprint; + time_t created; + time_t expires; + char *keyid; + char *email; + char *name; +}; + +struct _GMimeCertificateClass { + GObjectClass parent_class; + +}; + + +GType g_mime_certificate_get_type (void); + +GMimeCertificate *g_mime_certificate_new (void); + +void g_mime_certificate_set_trust (GMimeCertificate *cert, GMimeCertificateTrust trust); +GMimeCertificateTrust g_mime_certificate_get_trust (GMimeCertificate *cert); + +void g_mime_certificate_set_pubkey_algo (GMimeCertificate *cert, GMimePubKeyAlgo algo); +GMimePubKeyAlgo g_mime_certificate_get_pubkey_algo (GMimeCertificate *cert); + +void g_mime_certificate_set_digest_algo (GMimeCertificate *cert, GMimeDigestAlgo algo); +GMimeDigestAlgo g_mime_certificate_get_digest_algo (GMimeCertificate *cert); + +void g_mime_certificate_set_issuer_serial (GMimeCertificate *cert, const char *issuer_serial); +const char *g_mime_certificate_get_issuer_serial (GMimeCertificate *cert); + +void g_mime_certificate_set_issuer_name (GMimeCertificate *cert, const char *issuer_name); +const char *g_mime_certificate_get_issuer_name (GMimeCertificate *cert); + +void g_mime_certificate_set_fingerprint (GMimeCertificate *cert, const char *fingerprint); +const char *g_mime_certificate_get_fingerprint (GMimeCertificate *cert); + +void g_mime_certificate_set_key_id (GMimeCertificate *cert, const char *key_id); +const char *g_mime_certificate_get_key_id (GMimeCertificate *cert); + +void g_mime_certificate_set_email (GMimeCertificate *cert, const char *email); +const char *g_mime_certificate_get_email (GMimeCertificate *cert); + +void g_mime_certificate_set_name (GMimeCertificate *cert, const char *name); +const char *g_mime_certificate_get_name (GMimeCertificate *cert); + +void g_mime_certificate_set_created (GMimeCertificate *cert, time_t created); +time_t g_mime_certificate_get_created (GMimeCertificate *cert); + +void g_mime_certificate_set_expires (GMimeCertificate *cert, time_t expires); +time_t g_mime_certificate_get_expires (GMimeCertificate *cert); + + +/** + * GMimeCertificateList: + * @parent_object: parent #GObject + * @array: An array of #GMimeCertificate objects. + * + * A collection of #GMimeCertificate objects. + **/ +struct _GMimeCertificateList { + GObject parent_object; + GPtrArray *array; +}; + +struct _GMimeCertificateListClass { + GObjectClass parent_class; + +}; + + +GType g_mime_certificate_list_get_type (void); + +GMimeCertificateList *g_mime_certificate_list_new (void); + +int g_mime_certificate_list_length (GMimeCertificateList *list); + +void g_mime_certificate_list_clear (GMimeCertificateList *list); + +int g_mime_certificate_list_add (GMimeCertificateList *list, GMimeCertificate *cert); +void g_mime_certificate_list_insert (GMimeCertificateList *list, int index, GMimeCertificate *cert); +gboolean g_mime_certificate_list_remove (GMimeCertificateList *list, GMimeCertificate *cert); +gboolean g_mime_certificate_list_remove_at (GMimeCertificateList *list, int index); + +gboolean g_mime_certificate_list_contains (GMimeCertificateList *list, GMimeCertificate *cert); +int g_mime_certificate_list_index_of (GMimeCertificateList *list, GMimeCertificate *cert); + +GMimeCertificate *g_mime_certificate_list_get_certificate (GMimeCertificateList *list, int index); +void g_mime_certificate_list_set_certificate (GMimeCertificateList *list, int index, GMimeCertificate *cert); + +G_END_DECLS + +#endif /* __GMIME_CERTIFICATE_H__ */ diff --git a/gmime/gmime-charset-map-private.h b/gmime/gmime-charset-map-private.h new file mode 100644 index 0000000..f1e85a5 --- /dev/null +++ b/gmime/gmime-charset-map-private.h @@ -0,0 +1,9500 @@ +/* This file is automatically generated: DO NOT EDIT */ + +static unsigned char m000[256] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, + 0xdf, 0xdf, 0xdf, 0xdf, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x1f, 0x1f, 0x1f, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, + 0xff, 0x00, 0x80, 0xc0, 0xa3, 0x80, 0xc0, 0xd3, + 0xc3, 0xcc, 0x00, 0xc0, 0xc0, 0xf3, 0x80, 0x82, + 0xcf, 0xc0, 0xcc, 0xc0, 0x83, 0x80, 0x80, 0xcc, + 0x83, 0x80, 0x00, 0xc0, 0x80, 0xc0, 0x80, 0x00, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x02, 0x02, 0x01, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x03, 0x02, 0x03, 0x83, + 0x02, 0x00, 0x03, 0x02, 0x03, 0x01, 0x00, 0x03, + 0x00, 0x03, 0x03, 0x02, 0x03, 0x02, 0x02, 0x01, + 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x03, 0x02, 0x03, 0x8f, + 0x02, 0x00, 0x03, 0x02, 0x03, 0x01, 0x00, 0x00, +}; + +static unsigned char m001[256] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, + 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, + 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, + 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, + 0xff, 0xf5, 0xf7, 0xf7, 0xfb, 0xf5, 0xfb, 0xff, + 0xf1, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf7, 0xf7, 0xf1, 0xff, 0xff, 0xff, + 0xf1, 0xf7, 0xf5, 0xff, 0xf3, 0xf3, 0xf3, 0xf5, + 0xf5, 0xf5, 0xf5, 0xf5, 0xf7, 0xf7, 0xf7, 0xf5, + 0xf5, 0xf7, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + 0xf4, 0xf5, 0xf5, 0xf7, 0xf5, 0xf7, 0xf7, 0xf7, + 0xf7, 0xf5, 0xf5, 0xf5, 0xf7, 0xf4, 0xf4, 0xf7, + 0xf5, 0xf5, 0xf5, 0xf5, 0xf7, 0xf7, 0xf7, 0xf5, + 0xf5, 0xf7, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, 0xf5, + 0xf4, 0xf5, 0xf5, 0xf7, 0xf5, 0xf7, 0xf7, 0xf7, + 0xf7, 0xf5, 0xf5, 0xf5, 0xf7, 0xf4, 0xf4, 0xf5, +}; + +static unsigned char m002[256] = { + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +}; + +static unsigned char m010[256] = { + 0x02, 0x02, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x01, 0x01, + 0x03, 0x03, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, + 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x02, 0x01, 0x01, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01, + 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, + 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m011[256] = { + 0xf2, 0xf2, 0xf0, 0xf0, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, + 0xf0, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, 0xf2, 0xf2, + 0xf1, 0xf1, 0xf0, 0xf0, 0xf0, 0xf0, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf4, 0xf4, 0xf0, 0xf0, 0xf2, 0xf2, + 0xf0, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, 0xf1, 0xf1, + 0xf6, 0xf6, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf2, 0xf2, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf4, 0xf2, 0xf2, 0xf2, 0xf2, 0xf6, 0xf6, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +}; + +#define m012 m002 + +static unsigned char m020[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m021[256] = { + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +}; + +#define m022 m002 + +static unsigned char m030[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, + 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +#define m031 m021 + +#define m032 m002 + +static unsigned char m040[256] = { + 0x00, 0x1c, 0x10, 0x10, 0x18, 0x10, 0x18, 0x18, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x00, 0x1c, 0x10, 0x10, 0x18, 0x10, 0x18, 0x18, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m041[256] = { + 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xf8, 0xf8, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, +}; + +#define m042 m002 + +static unsigned char m050[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +#define m051 m021 + +#define m052 m002 + +static unsigned char m060[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +#define m061 m021 + +#define m062 m002 + +#define m071 m021 + +#define m072 m002 + +#define m081 m021 + +#define m082 m002 + +#define m091 m021 + +#define m092 m002 + +#define m0a1 m021 + +#define m0a2 m002 + +#define m0b1 m021 + +#define m0b2 m002 + +#define m0c1 m021 + +#define m0c2 m002 + +#define m0d1 m021 + +#define m0d2 m002 + +#define m0e1 m021 + +#define m0e2 m002 + +#define m0f1 m021 + +#define m0f2 m002 + +#define m101 m021 + +#define m102 m002 + +#define m111 m021 + +#define m112 m002 + +#define m121 m021 + +#define m122 m002 + +#define m131 m021 + +#define m132 m002 + +#define m141 m021 + +#define m142 m002 + +#define m151 m021 + +#define m152 m002 + +#define m161 m021 + +#define m162 m002 + +#define m171 m021 + +#define m172 m002 + +#define m181 m021 + +#define m182 m002 + +#define m191 m021 + +#define m192 m002 + +static unsigned char m1a1[256] = { + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, +}; + +#define m1a2 m002 + +static unsigned char m1b1[256] = { + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +}; + +#define m1b2 m002 + +static unsigned char m1c1[256] = { + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, +}; + +#define m1c2 m002 + +#define m1d1 m1c1 + +static unsigned char m1d2[256] = { + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +#define m1e1 m1c1 + +static unsigned char m1e2[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +#define m1f1 m1c1 + +#define m1f2 m1e2 + +static unsigned char m200[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m201[256] = { + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xf0, 0xc0, 0xc0, 0xc8, 0xc8, 0xf0, 0xf0, 0xc0, + 0xf8, 0xfa, 0xc8, 0xc0, 0xfa, 0xfa, 0xca, 0xc0, + 0xf8, 0xf8, 0xc8, 0xc0, 0xc0, 0xf0, 0xf8, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xf8, 0xc0, 0xf0, 0xf0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc8, 0xc8, 0xf0, 0xc0, 0xc0, 0xf0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0xc0, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, + 0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0xc0, 0x40, 0x40, 0xcc, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; + +static unsigned char m202[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m210[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m211[256] = { + 0x40, 0x40, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x40, + 0x40, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0xc0, 0x40, 0x40, 0xc8, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0xc0, 0xc8, 0x40, 0x40, 0x40, 0xc0, 0x40, + 0x40, 0x40, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0xc0, 0xc0, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0x40, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0xf0, 0xf0, 0xf0, 0xf0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; + +static unsigned char m212[256] = { + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m220[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m221[256] = { + 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0x40, 0xf0, + 0xf0, 0x40, 0x40, 0xf0, 0x40, 0x40, 0x40, 0xc0, + 0x40, 0xc0, 0x70, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0xf0, 0x40, 0x40, 0xf0, 0xf0, 0x40, + 0xf0, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x40, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0xc0, 0x40, + 0x40, 0x40, 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0xc0, 0xf0, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0xf0, 0xf0, 0x40, 0x40, 0xc0, 0xc0, 0x70, 0x70, + 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0xf0, 0xf0, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0xf0, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; + +static unsigned char m222[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m230[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m231[256] = { + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; + +static unsigned char m232[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m241[256] = { + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x40, + 0x40, 0x40, 0x40, 0x40, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; + +static unsigned char m242[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m250[256] = { + 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0c, 0x04, 0x0c, 0x04, 0x04, 0x0c, + 0x0c, 0x0c, 0x0c, 0x0c, 0x04, 0x0c, 0x0c, 0x0c, + 0x0c, 0x0c, 0x04, 0x0c, 0x04, 0x04, 0x0c, 0x0c, + 0x0c, 0x0c, 0x0c, 0x04, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x0c, 0x0c, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m251[256] = { + 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0xf0, 0xc0, 0xc0, 0xf0, + 0xf0, 0xc0, 0xc0, 0xf0, 0xf0, 0xc0, 0xc0, 0xf0, + 0xf0, 0xc0, 0xc0, 0xf0, 0xf0, 0xf0, 0xc0, 0xc0, + 0xf0, 0xc0, 0xc0, 0xf0, 0xf0, 0xf0, 0xc0, 0xc0, + 0xf0, 0xc0, 0xc0, 0xf0, 0xf0, 0xc0, 0xc0, 0xf0, + 0xf0, 0xc0, 0xc0, 0xf0, 0xf0, 0xc0, 0xc0, 0xf0, + 0xf0, 0xc0, 0xc0, 0xf0, 0xf0, 0xc0, 0xc0, 0xf0, + 0xc0, 0xc0, 0xf0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xf0, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0xf0, 0xf0, 0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0xc0, 0xc0, + 0x40, 0x40, 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x40, + 0xc0, 0xc0, 0x40, 0x40, 0x40, 0x40, 0xf0, 0xf0, + 0xc0, 0x40, 0x40, 0xf0, 0x40, 0x40, 0xf0, 0xf0, + 0xc0, 0xc0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x70, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; + +static unsigned char m252[256] = { + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m261[256] = { + 0x40, 0x40, 0x40, 0x40, 0x40, 0xf0, 0xf0, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0xc0, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0xc0, 0x40, 0xc0, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0xf0, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0xc0, 0xc0, 0x40, 0xc0, 0xc0, 0xc0, 0x40, 0xc0, + 0xc0, 0xc0, 0xf0, 0x40, 0xc0, 0xf0, 0x40, 0x70, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; + +static unsigned char m262[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m271[256] = { + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; + +#define m272 m1e2 + +#define m281 m271 + +#define m282 m1e2 + +#define m291 m271 + +#define m292 m1e2 + +#define m2a1 m271 + +#define m2a2 m1e2 + +#define m2b1 m271 + +#define m2b2 m1e2 + +#define m2c1 m271 + +#define m2c2 m1e2 + +#define m2d1 m271 + +#define m2d2 m1e2 + +#define m2e1 m271 + +#define m2e2 m1e2 + +#define m2f1 m271 + +#define m2f2 m1e2 + +static unsigned char m301[256] = { + 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x70, 0x70, 0x70, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x70, 0xf0, 0xf0, 0xf0, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x70, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x70, 0x70, 0x70, 0x70, 0x40, + 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, + 0x40, 0x40, 0x40, 0x70, 0x70, 0x70, 0x70, 0x40, +}; + +static unsigned char m302[256] = { + 0x07, 0x07, 0x07, 0x07, 0x06, 0x07, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m311[256] = { + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, +}; + +static unsigned char m312[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m321[256] = { + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, + 0xc0, 0xc0, 0xc0, 0xc0, 0x40, 0x40, 0xc0, 0xc0, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m322[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m331[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +#define m332 m1e2 + +#define m342 m1e2 + +#define m352 m1e2 + +static unsigned char m362[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +}; + +static unsigned char m372[256] = { + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, +}; + +#define m382 m372 + +#define m392 m372 + +#define m3a2 m372 + +#define m3b2 m372 + +#define m3c2 m372 + +#define m3d2 m372 + +#define m3e2 m372 + +#define m3f2 m372 + +#define m402 m372 + +#define m412 m372 + +#define m422 m372 + +#define m432 m372 + +#define m442 m372 + +#define m452 m372 + +#define m462 m372 + +#define m472 m372 + +#define m482 m372 + +#define m492 m372 + +#define m4a2 m372 + +#define m4b2 m372 + +#define m4c2 m372 + +#define m4d2 m372 + +static unsigned char m4e1[256] = { + 0xf0, 0xf0, 0x40, 0xf0, 0x40, 0x40, 0x00, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0xf0, 0x70, 0x00, + 0x70, 0xf0, 0x40, 0x00, 0xf0, 0xf0, 0xf0, 0x70, + 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x00, 0x70, 0x00, 0x40, 0x40, 0x00, 0x70, 0x00, + 0x40, 0x00, 0x70, 0x40, 0x00, 0xf0, 0x40, 0x40, + 0x40, 0x70, 0xf0, 0x00, 0x00, 0x40, 0x70, 0x00, + 0xf0, 0xf0, 0x00, 0xf0, 0x70, 0x00, 0x00, 0x70, + 0x40, 0x40, 0xf0, 0xf0, 0x40, 0xf0, 0x00, 0x40, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0xf0, 0xf0, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x70, + 0xf0, 0xf0, 0x40, 0x00, 0x40, 0xf0, 0xf0, 0xf0, + 0x00, 0x00, 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x70, 0x00, 0xf0, 0x40, 0x40, 0x80, 0x80, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x70, 0x00, 0xf0, 0x00, 0x00, 0x70, 0xf0, 0x00, + 0xf0, 0x70, 0x70, 0xf0, 0xf0, 0x40, 0xf0, 0x00, + 0x80, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x40, 0x40, + 0xf0, 0x70, 0x00, 0xf0, 0x70, 0x40, 0xf0, 0x70, + 0x70, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0x00, + 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, + 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0x70, 0x40, 0xf0, 0x00, 0x70, 0xf0, + 0x00, 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0x70, 0x70, + 0x40, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x40, 0x40, 0x00, 0xf0, 0x70, 0xf0, + 0x40, 0x40, 0x40, 0xf0, 0xf0, 0xf0, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x40, + 0xf0, 0x40, 0xf0, 0x40, 0x00, 0x40, 0xf0, 0xf0, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x40, +}; + +static unsigned char m4e2[256] = { + 0x07, 0x07, 0x04, 0x07, 0x04, 0x04, 0x04, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x07, 0x07, 0x04, 0x05, 0x07, 0x07, 0x07, 0x04, + 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x07, 0x06, + 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x06, 0x05, + 0x05, 0x04, 0x05, 0x07, 0x05, 0x07, 0x06, 0x04, + 0x07, 0x06, 0x07, 0x06, 0x05, 0x04, 0x05, 0x04, + 0x07, 0x07, 0x05, 0x07, 0x06, 0x05, 0x05, 0x05, + 0x04, 0x04, 0x06, 0x07, 0x04, 0x07, 0x04, 0x07, + 0x07, 0x05, 0x04, 0x07, 0x05, 0x07, 0x07, 0x07, + 0x05, 0x04, 0x07, 0x07, 0x05, 0x04, 0x07, 0x04, + 0x07, 0x07, 0x04, 0x04, 0x07, 0x07, 0x07, 0x07, + 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05, 0x04, + 0x04, 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x04, 0x07, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x07, 0x04, + 0x07, 0x05, 0x04, 0x07, 0x07, 0x07, 0x07, 0x05, + 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, + 0x05, 0x06, 0x05, 0x07, 0x04, 0x04, 0x06, 0x07, + 0x05, 0x07, 0x07, 0x04, 0x07, 0x07, 0x07, 0x05, + 0x07, 0x05, 0x04, 0x07, 0x07, 0x07, 0x07, 0x04, + 0x04, 0x04, 0x05, 0x07, 0x04, 0x05, 0x06, 0x04, + 0x04, 0x06, 0x07, 0x05, 0x04, 0x04, 0x04, 0x05, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x07, 0x07, + 0x06, 0x07, 0x07, 0x07, 0x04, 0x07, 0x05, 0x04, + 0x04, 0x05, 0x04, 0x05, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x04, 0x06, 0x07, 0x07, 0x07, + 0x04, 0x07, 0x04, 0x07, 0x07, 0x07, 0x04, 0x04, + 0x07, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, + 0x04, 0x04, 0x04, 0x07, 0x04, 0x07, 0x04, 0x07, +}; + +static unsigned char m4f1[256] = { + 0x40, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xf0, 0xf0, 0xc0, 0x40, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x00, 0x40, 0x70, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xf0, + 0x70, 0x40, 0x00, 0x40, 0xf0, 0x40, 0xf0, 0x40, + 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0x00, + 0x40, 0x00, 0x40, 0xf0, 0x00, 0x00, 0xf0, 0xf0, + 0xc0, 0x40, 0x00, 0x40, 0x40, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x40, 0x70, 0x40, 0xf0, 0x40, 0x70, + 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0x70, 0x40, + 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0x40, 0x00, 0x40, 0xf0, + 0xf0, 0x40, 0x00, 0xf0, 0x00, 0x70, 0xf0, 0x40, + 0x40, 0x40, 0xc0, 0x70, 0x70, 0x40, 0xc0, 0xf0, + 0x00, 0xc0, 0x40, 0xf0, 0xc0, 0x40, 0xf0, 0x00, + 0xf0, 0x40, 0xc0, 0xf0, 0x40, 0xf0, 0x40, 0xf0, + 0x40, 0xf0, 0x40, 0x40, 0x40, 0x00, 0xf0, 0x40, + 0xf0, 0x40, 0x40, 0xf0, 0x00, 0xf0, 0x40, 0x40, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0xf0, 0xf0, + 0x00, 0x00, 0x40, 0x00, 0x00, 0xf0, 0xf0, 0x40, + 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0xf0, + 0x40, 0x40, 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0x00, + 0x40, 0xc0, 0xf0, 0x40, 0x40, 0x40, 0xf0, 0x40, + 0x70, 0xf0, 0x40, 0x80, 0xf0, 0x00, 0x00, 0xf0, + 0x70, 0x00, 0xf0, 0x70, 0x40, 0xf0, 0x00, 0xf0, + 0xc0, 0xf0, 0x40, 0x70, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, + 0x40, 0x80, 0x40, 0xf0, 0x00, 0xf0, 0x70, 0x00, + 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x70, 0x40, +}; + +static unsigned char m4f2[256] = { + 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x07, 0x07, 0x06, 0x04, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x04, 0x05, + 0x07, 0x07, 0x05, 0x05, 0x04, 0x06, 0x05, 0x05, + 0x05, 0x04, 0x07, 0x04, 0x05, 0x05, 0x05, 0x05, + 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x04, 0x07, + 0x07, 0x04, 0x05, 0x06, 0x07, 0x04, 0x07, 0x04, + 0x07, 0x04, 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x07, 0x04, 0x04, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x05, 0x04, 0x07, + 0x04, 0x07, 0x06, 0x06, 0x07, 0x04, 0x06, 0x07, + 0x07, 0x04, 0x04, 0x07, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x04, 0x07, 0x04, 0x07, 0x04, 0x07, + 0x06, 0x07, 0x06, 0x04, 0x07, 0x06, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x04, + 0x05, 0x04, 0x04, 0x05, 0x04, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x04, 0x05, 0x04, 0x07, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x04, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x06, 0x06, 0x04, 0x06, 0x07, + 0x07, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x07, 0x04, 0x05, 0x04, 0x04, 0x05, 0x04, + 0x05, 0x05, 0x05, 0x04, 0x06, 0x05, 0x07, 0x07, + 0x04, 0x07, 0x04, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x04, 0x07, 0x04, 0x04, 0x04, 0x07, 0x04, +}; + +static unsigned char m501[256] = { + 0x40, 0x40, 0x80, 0x00, 0x40, 0x70, 0xf0, 0x40, + 0x00, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0x70, + 0x40, 0xf0, 0xf0, 0x40, 0x70, 0x00, 0xf0, 0x40, + 0x40, 0xf0, 0xf0, 0x40, 0xc0, 0x40, 0xc0, 0xf0, + 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0x70, 0xf0, 0xc0, + 0xf0, 0x70, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x00, + 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, 0x70, 0x00, + 0x00, 0x70, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x40, 0xf0, 0x00, 0x40, 0x40, 0xf0, + 0xf0, 0xf0, 0x40, 0x00, 0x40, 0x00, 0x40, 0xf0, + 0x70, 0x40, 0x40, 0x40, 0x00, 0xf0, 0x70, 0x40, + 0x00, 0x40, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x40, 0x40, 0x00, 0xf0, 0x40, 0x40, + 0x00, 0x00, 0x40, 0x00, 0x70, 0x40, 0x00, 0x00, + 0x40, 0x40, 0x70, 0x00, 0xf0, 0xf0, 0xf0, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0xf0, 0x40, 0x00, 0x40, 0x40, 0xf0, 0x40, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0xf0, 0x40, 0x40, + 0x40, 0xf0, 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, + 0xf0, 0xf0, 0x70, 0x40, 0x40, 0x00, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x40, + 0x40, 0x00, 0xf0, 0xf0, 0x70, 0xf0, 0x00, 0xf0, + 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0xf0, 0x00, + 0x40, 0x00, 0x70, 0x40, 0x40, 0xf0, 0x00, 0x40, + 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x70, 0x40, 0xf0, + 0x40, 0xf0, 0x00, 0x40, 0x40, 0xf0, 0xf0, 0x00, + 0x40, 0x00, 0xf0, 0x00, 0x40, 0x40, 0xf0, 0x40, + 0x00, 0x00, 0x40, 0x70, 0x40, 0xf0, 0x40, 0xf0, + 0x40, 0x40, 0x00, 0x00, 0x00, 0xf0, 0x70, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x00, 0x70, 0x40, 0x00, + 0x00, 0xf0, 0x40, 0xf0, 0x00, 0x00, 0x40, 0x80, +}; + +static unsigned char m502[256] = { + 0x06, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x07, 0x07, 0x06, 0x07, + 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x04, 0x07, 0x07, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x05, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x04, + 0x06, 0x06, 0x04, 0x07, 0x04, 0x06, 0x06, 0x07, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x06, + 0x04, 0x04, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x04, 0x04, 0x06, 0x05, 0x04, 0x06, 0x05, 0x05, + 0x07, 0x04, 0x06, 0x06, 0x04, 0x07, 0x04, 0x06, + 0x05, 0x04, 0x04, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, + 0x05, 0x05, 0x04, 0x04, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x07, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x07, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x04, 0x04, 0x07, 0x06, 0x04, 0x06, 0x04, 0x04, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x07, 0x04, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x07, 0x04, 0x06, 0x06, 0x06, +}; + +static unsigned char m511[256] = { + 0xf0, 0xf0, 0x70, 0x40, 0xf0, 0x00, 0xc0, 0x40, + 0x40, 0xf0, 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x40, 0x00, 0xf0, 0x00, 0x70, 0x70, 0x70, 0x40, + 0x70, 0x40, 0x70, 0x40, 0x40, 0x40, 0x40, 0xf0, + 0x00, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x00, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x00, 0xf0, + 0x40, 0x40, 0xf0, 0x70, 0xf0, 0x00, 0x00, 0x70, + 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, + 0x70, 0x00, 0xf0, 0x40, 0x70, 0x40, 0x00, 0x40, + 0x40, 0x00, 0x70, 0x00, 0xf0, 0x00, 0x00, 0x40, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0xf0, 0x40, 0x80, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, + 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x00, + 0xf0, 0x00, 0x70, 0x40, 0x40, 0x70, 0xf0, 0x00, + 0x00, 0x70, 0xf0, 0x40, 0x70, 0xf0, 0x40, 0x70, + 0x70, 0x70, 0xf0, 0x70, 0x00, 0xf0, 0x70, 0xf0, + 0x40, 0x70, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0xf0, 0x40, 0x70, 0x40, 0x70, 0xf0, 0x70, 0x00, + 0x70, 0x70, 0xf0, 0x70, 0xf0, 0x40, 0x00, 0x00, + 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xf0, 0xf0, + 0x40, 0x00, 0x40, 0x00, 0x40, 0xf0, 0x40, 0x40, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0x70, 0xf0, 0x00, + 0x40, 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0x00, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x00, 0x40, 0x70, 0x00, + 0x40, 0x00, 0x00, 0x70, 0xf0, 0xf0, 0xc0, 0x00, + 0x70, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x70, 0x70, + 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x40, 0x00, + 0xf0, 0xf0, 0x40, 0x40, 0x40, 0x70, 0xf0, 0x40, + 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x70, 0x00, +}; + +static unsigned char m512[256] = { + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x04, 0x04, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x07, + 0x07, 0x07, 0x04, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x07, 0x07, 0x04, 0x07, 0x06, 0x07, 0x04, 0x04, + 0x04, 0x05, 0x06, 0x04, 0x07, 0x07, 0x05, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x04, 0x07, 0x04, 0x06, + 0x07, 0x06, 0x04, 0x07, 0x07, 0x07, 0x07, 0x04, + 0x05, 0x07, 0x04, 0x05, 0x05, 0x07, 0x07, 0x07, + 0x07, 0x05, 0x04, 0x05, 0x07, 0x05, 0x04, 0x04, + 0x07, 0x05, 0x05, 0x04, 0x04, 0x05, 0x04, 0x06, + 0x05, 0x07, 0x06, 0x04, 0x05, 0x07, 0x04, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x06, 0x07, 0x05, 0x07, + 0x06, 0x05, 0x04, 0x05, 0x05, 0x04, 0x06, 0x04, + 0x07, 0x04, 0x07, 0x04, 0x07, 0x07, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x05, 0x07, 0x04, 0x04, 0x05, + 0x07, 0x07, 0x05, 0x05, 0x04, 0x05, 0x07, 0x07, + 0x04, 0x06, 0x04, 0x05, 0x07, 0x07, 0x06, 0x04, + 0x05, 0x04, 0x04, 0x04, 0x07, 0x06, 0x07, 0x05, + 0x06, 0x05, 0x06, 0x07, 0x07, 0x06, 0x06, 0x05, + 0x06, 0x05, 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x04, 0x05, 0x06, 0x07, 0x06, 0x04, + 0x07, 0x07, 0x04, 0x04, 0x05, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, + 0x07, 0x06, 0x04, 0x07, 0x04, 0x07, 0x07, 0x04, + 0x07, 0x07, 0x07, 0x05, 0x05, 0x07, 0x04, 0x05, +}; + +static unsigned char m521[256] = { + 0xf0, 0x40, 0x40, 0xf0, 0x70, 0x40, 0xf0, 0xf0, + 0xf0, 0x00, 0xf0, 0x70, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0xf0, 0x40, 0x40, 0x70, 0x40, 0x40, 0xf0, + 0x40, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x70, + 0x40, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0xf0, 0x40, 0x40, 0x70, 0x00, 0x40, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x70, 0x40, 0x00, 0xf0, + 0x00, 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0xf0, 0x40, + 0x40, 0x00, 0x40, 0xf0, 0x40, 0x80, 0x70, 0x40, + 0x40, 0xc0, 0x00, 0x70, 0x70, 0x70, 0x40, 0x00, + 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x40, 0xf0, + 0x70, 0x70, 0xf0, 0x70, 0x70, 0xf0, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf0, + 0x40, 0x00, 0x40, 0xf0, 0x00, 0x40, 0x00, 0xf0, + 0xf0, 0xf0, 0x40, 0x00, 0x40, 0xf0, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0x40, 0x70, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x40, 0xf0, 0x40, 0x00, 0x00, 0xf0, + 0xf0, 0x00, 0x00, 0xf0, 0xc0, 0x40, 0x40, 0x40, + 0x00, 0xf0, 0xf0, 0xf0, 0x70, 0x70, 0x00, 0x40, + 0x40, 0x70, 0x00, 0x00, 0x70, 0x70, 0x40, 0x40, + 0x40, 0x70, 0x40, 0x40, 0x70, 0x40, 0xf0, 0x00, + 0x40, 0xf0, 0x00, 0xf0, 0x40, 0xf0, 0x40, 0xf0, + 0x40, 0xf0, 0x00, 0x00, 0x40, 0xf0, 0x00, 0x40, + 0x00, 0x40, 0xf0, 0x00, 0x40, 0xf0, 0xc0, 0x70, + 0xf0, 0xf0, 0x00, 0xc0, 0x40, 0xf0, 0xf0, 0xf0, + 0x70, 0x40, 0xf0, 0xf0, 0xf0, 0x40, 0x70, 0x70, + 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x70, 0xf0, 0x40, 0xf0, 0x40, 0x40, + 0xf0, 0x70, 0xf0, 0x80, 0x00, 0x00, 0xf0, 0xf0, +}; + +static unsigned char m522[256] = { + 0x07, 0x07, 0x05, 0x07, 0x04, 0x04, 0x07, 0x07, + 0x07, 0x06, 0x07, 0x04, 0x06, 0x05, 0x07, 0x04, + 0x06, 0x07, 0x07, 0x06, 0x04, 0x04, 0x07, 0x07, + 0x05, 0x05, 0x05, 0x05, 0x06, 0x07, 0x06, 0x04, + 0x05, 0x06, 0x04, 0x04, 0x07, 0x06, 0x04, 0x04, + 0x07, 0x07, 0x06, 0x05, 0x04, 0x05, 0x07, 0x04, + 0x07, 0x06, 0x06, 0x07, 0x04, 0x06, 0x07, 0x07, + 0x07, 0x05, 0x07, 0x07, 0x04, 0x05, 0x04, 0x05, + 0x05, 0x07, 0x05, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x07, 0x07, 0x06, 0x04, + 0x05, 0x05, 0x06, 0x04, 0x07, 0x06, 0x07, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, + 0x04, 0x07, 0x06, 0x04, 0x04, 0x05, 0x04, 0x05, + 0x04, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x04, 0x07, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x04, 0x07, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x05, 0x06, 0x04, 0x07, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x07, 0x04, 0x05, 0x05, 0x07, + 0x07, 0x05, 0x05, 0x07, 0x04, 0x04, 0x06, 0x04, + 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x04, + 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x07, 0x05, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x04, 0x04, 0x07, + 0x04, 0x07, 0x04, 0x05, 0x04, 0x06, 0x04, 0x04, + 0x05, 0x04, 0x07, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x07, 0x04, 0x06, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x05, 0x07, 0x06, 0x06, 0x04, 0x07, 0x07, +}; + +static unsigned char m531[256] = { + 0x40, 0x70, 0x70, 0x40, 0x00, 0xf0, 0x70, 0x00, + 0xf0, 0x00, 0x40, 0x40, 0x40, 0xf0, 0x00, 0xf0, + 0xf0, 0x40, 0x00, 0x40, 0x00, 0xf0, 0xf0, 0xf0, + 0x40, 0xf0, 0x70, 0x40, 0x40, 0x70, 0x40, 0x40, + 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x00, 0x40, + 0x40, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x00, 0xf0, + 0x40, 0x70, 0x40, 0x70, 0x00, 0x40, 0x00, 0x00, + 0x70, 0xf0, 0x70, 0x70, 0x40, 0x40, 0x40, 0xf0, + 0xf0, 0xf0, 0x40, 0xf0, 0x80, 0x70, 0x70, 0xf0, + 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0xf0, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0xf0, + 0x70, 0x40, 0xf0, 0x40, 0xf0, 0x00, 0xf0, 0x00, + 0xf0, 0x40, 0x00, 0x40, 0x00, 0x40, 0xf0, 0x00, + 0x80, 0x70, 0x00, 0x00, 0x40, 0x40, 0x70, 0xf0, + 0xf0, 0xf0, 0x40, 0x70, 0xf0, 0xf0, 0x00, 0xf0, + 0x70, 0x40, 0x00, 0x70, 0x00, 0x80, 0x40, 0xf0, + 0x00, 0x00, 0x70, 0x40, 0xf0, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x70, 0x00, + 0xf0, 0x40, 0xf0, 0x00, 0x00, 0x40, 0x00, 0xf0, + 0xf0, 0x40, 0x00, 0x00, 0x40, 0xf0, 0xf0, 0x00, + 0x70, 0x70, 0x40, 0x40, 0x00, 0xf0, 0x70, 0x40, + 0x70, 0x00, 0x40, 0x70, 0x40, 0x40, 0x70, 0x40, + 0x40, 0x00, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x00, + 0x40, 0x00, 0x70, 0xf0, 0x00, 0x40, 0x00, 0x00, + 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, 0x70, 0x40, + 0x00, 0x00, 0x40, 0x40, 0xf0, 0x40, 0xf0, 0xf0, + 0x00, 0x70, 0x40, 0xf0, 0x00, 0x40, 0x40, 0x70, + 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x40, + 0x70, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x40, 0x70, 0x70, + 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m532[256] = { + 0x05, 0x04, 0x04, 0x04, 0x04, 0x07, 0x07, 0x04, + 0x07, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, + 0x07, 0x06, 0x06, 0x04, 0x04, 0x07, 0x07, 0x07, + 0x04, 0x07, 0x07, 0x04, 0x06, 0x07, 0x04, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x04, 0x04, 0x05, 0x04, + 0x04, 0x04, 0x07, 0x04, 0x04, 0x06, 0x05, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x07, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x04, 0x07, 0x06, 0x07, 0x04, 0x07, + 0x07, 0x07, 0x07, 0x04, 0x06, 0x06, 0x05, 0x05, + 0x04, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, 0x07, + 0x04, 0x04, 0x07, 0x04, 0x07, 0x04, 0x07, 0x05, + 0x07, 0x07, 0x05, 0x07, 0x05, 0x04, 0x07, 0x05, + 0x04, 0x05, 0x04, 0x05, 0x06, 0x04, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x05, 0x07, 0x04, 0x07, + 0x07, 0x06, 0x05, 0x06, 0x06, 0x04, 0x04, 0x07, + 0x04, 0x04, 0x07, 0x04, 0x07, 0x05, 0x05, 0x04, + 0x04, 0x05, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x04, 0x06, 0x05, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, + 0x04, 0x04, 0x05, 0x05, 0x06, 0x07, 0x05, 0x06, + 0x05, 0x05, 0x04, 0x04, 0x06, 0x06, 0x05, 0x04, + 0x04, 0x04, 0x06, 0x04, 0x06, 0x04, 0x05, 0x04, + 0x04, 0x06, 0x04, 0x07, 0x04, 0x04, 0x04, 0x05, + 0x04, 0x05, 0x05, 0x06, 0x04, 0x04, 0x04, 0x04, + 0x07, 0x07, 0x07, 0x07, 0x05, 0x07, 0x04, 0x04, + 0x04, 0x05, 0x04, 0x04, 0x07, 0x04, 0x07, 0x07, + 0x05, 0x05, 0x04, 0x07, 0x04, 0x04, 0x04, 0x07, + 0x05, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x04, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x04, 0x07, 0x05, 0x05, + 0x07, 0x05, 0x04, 0x07, 0x07, 0x05, 0x04, 0x04, +}; + +static unsigned char m541[256] = { + 0x00, 0x70, 0x40, 0xf0, 0xf0, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xf0, 0x70, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0xf0, 0x00, 0xf0, 0x00, 0xf0, + 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x40, 0xf0, 0x40, 0xf0, 0x70, 0x70, 0x70, 0x40, + 0x00, 0x40, 0x00, 0x80, 0x40, 0x40, 0x70, 0x00, + 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x70, 0xf0, 0x00, + 0x70, 0x00, 0xf0, 0x40, 0x40, 0x00, 0x70, 0x40, + 0xf0, 0x70, 0xf0, 0x00, 0x00, 0x40, 0x70, 0x40, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, + 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x40, + 0xf0, 0x40, 0xf0, 0x40, 0x00, 0x40, 0x40, 0x00, + 0x70, 0xf0, 0x00, 0xf0, 0x40, 0xf0, 0x70, 0x70, + 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0x00, 0x40, + 0xf0, 0x40, 0x00, 0x40, 0x70, 0x40, 0xf0, 0x00, + 0x40, 0x40, 0x00, 0x70, 0xf0, 0x40, 0xf0, 0x70, + 0xf0, 0x40, 0x70, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x40, 0x70, 0x00, 0xf0, 0x70, 0x40, 0x40, + 0xf0, 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0x70, + 0x00, 0x40, 0x70, 0xf0, 0x00, 0x00, 0x00, 0x40, + 0xf0, 0x40, 0x40, 0x40, 0x70, 0xf0, 0x70, 0x40, + 0xf0, 0xf0, 0x70, 0x00, 0xf0, 0x00, 0x40, 0x70, + 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xf0, 0x70, 0x00, 0x00, 0xf0, 0x70, 0x00, + 0xf0, 0x70, 0x40, 0x00, 0x40, 0xf0, 0xf0, 0x40, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0x70, 0x40, 0x40, +}; + +static unsigned char m542[256] = { + 0x04, 0x07, 0x04, 0x07, 0x07, 0x04, 0x07, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x05, 0x04, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x05, 0x04, 0x05, 0x06, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x05, + 0x06, 0x07, 0x05, 0x06, 0x05, 0x07, 0x06, 0x06, + 0x07, 0x07, 0x04, 0x07, 0x07, 0x06, 0x07, 0x04, + 0x07, 0x06, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, + 0x07, 0x04, 0x07, 0x05, 0x04, 0x04, 0x06, 0x06, + 0x05, 0x04, 0x05, 0x05, 0x07, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x04, 0x05, 0x05, 0x04, 0x04, 0x04, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, + 0x07, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x04, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x07, 0x06, + 0x06, 0x04, 0x04, 0x07, 0x07, 0x06, 0x07, 0x05, + 0x07, 0x06, 0x07, 0x04, 0x05, 0x07, 0x07, 0x04, + 0x06, 0x05, 0x07, 0x05, 0x04, 0x05, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x05, 0x05, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x07, + 0x06, 0x07, 0x04, 0x07, 0x05, 0x04, 0x06, 0x06, + 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x06, 0x07, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x04, 0x05, 0x05, 0x07, 0x07, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x05, + 0x04, 0x05, 0x05, 0x04, 0x05, 0x05, 0x07, 0x05, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x06, 0x04, 0x07, 0x07, 0x04, + 0x04, 0x06, 0x07, 0x07, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x07, 0x07, 0x04, 0x07, +}; + +static unsigned char m551[256] = { + 0x40, 0x40, 0x00, 0x00, 0xf0, 0x40, 0xf0, 0xf0, + 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0xc0, 0x70, + 0xf0, 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x70, 0xf0, + 0x00, 0xf0, 0x40, 0x70, 0x00, 0xc0, 0x40, 0x00, + 0x70, 0x70, 0x00, 0x40, 0x40, 0x40, 0xf0, 0x00, + 0x70, 0x40, 0x00, 0x00, 0xf0, 0x70, 0xf0, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x70, 0x40, 0x00, 0xf0, + 0x40, 0x40, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x70, + 0x40, 0x00, 0x40, 0x40, 0x70, 0x70, 0xc0, 0x00, + 0x40, 0x40, 0x00, 0xf0, 0x40, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0xf0, 0x00, 0x70, 0x40, + 0xf0, 0x40, 0x40, 0x70, 0xf0, 0x00, 0xc0, 0xf0, + 0x40, 0xf0, 0xf0, 0x70, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, + 0xf0, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x70, 0x70, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0xf0, + 0x70, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0xf0, 0x00, + 0x70, 0x00, 0x40, 0x00, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x40, 0x00, 0x40, 0x70, 0xf0, 0x40, 0xf0, + 0x00, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, 0x00, + 0x00, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x00, 0x40, + 0x40, 0x00, 0xf0, 0x40, 0xf0, 0x00, 0x40, 0xf0, + 0x00, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, + 0x00, 0x70, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x40, +}; + +static unsigned char m552[256] = { + 0x04, 0x07, 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, + 0x07, 0x07, 0x06, 0x04, 0x07, 0x04, 0x04, 0x06, + 0x04, 0x04, 0x06, 0x05, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x04, 0x05, 0x05, 0x05, 0x04, 0x06, 0x07, + 0x04, 0x04, 0x07, 0x04, 0x07, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x04, 0x06, 0x07, 0x04, 0x07, 0x05, + 0x06, 0x07, 0x04, 0x07, 0x07, 0x06, 0x07, 0x04, + 0x06, 0x05, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x04, 0x04, 0x07, 0x07, 0x06, + 0x04, 0x04, 0x04, 0x04, 0x07, 0x04, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, + 0x04, 0x04, 0x07, 0x04, 0x05, 0x05, 0x05, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, + 0x05, 0x04, 0x04, 0x07, 0x07, 0x06, 0x07, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x07, 0x06, 0x06, 0x07, 0x06, 0x04, 0x04, + 0x07, 0x07, 0x06, 0x04, 0x07, 0x07, 0x04, 0x07, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x05, + 0x04, 0x05, 0x04, 0x07, 0x04, 0x05, 0x05, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x07, 0x06, 0x07, 0x04, + 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, 0x07, + 0x04, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x07, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x07, + 0x04, 0x04, 0x07, 0x05, 0x04, 0x05, 0x06, 0x07, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x07, 0x07, 0x06, +}; + +static unsigned char m561[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xf0, 0x00, + 0x40, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x00, 0xf0, 0x00, 0x70, 0xf0, + 0x70, 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x40, 0x00, 0x00, 0xf0, + 0x40, 0x70, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x40, + 0x70, 0x40, 0x00, 0x40, 0x40, 0x40, 0x00, 0x40, + 0x40, 0x40, 0x70, 0x40, 0x40, 0x00, 0x40, 0x00, + 0x00, 0x40, 0x00, 0x40, 0x70, 0x40, 0x70, 0x40, + 0x70, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x70, 0x00, 0x40, 0x00, + 0xf0, 0x40, 0x70, 0xf0, 0x70, 0x40, 0x00, 0x40, + 0x00, 0x40, 0x40, 0x00, 0xf0, 0x40, 0x00, 0x00, + 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x40, 0x40, 0xf0, 0x70, + 0x40, 0x00, 0x70, 0x40, 0x40, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x70, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x40, 0x40, + 0x40, 0x40, 0x00, 0x40, 0xc0, 0x40, 0xf0, 0x00, + 0x00, 0x40, 0x00, 0x40, 0xf0, 0x00, 0x70, 0x40, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x00, + 0x70, 0x70, 0x70, 0x70, 0x00, 0x40, 0x00, 0x00, + 0x70, 0x40, 0xc0, 0x40, 0x40, 0xc0, 0x70, 0x40, + 0x40, 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, + 0x70, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0xf0, 0x40, + 0xf0, 0x40, 0x00, 0x70, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x40, 0x00, 0x40, 0x70, 0x00, + 0xf0, 0x40, 0x70, 0x70, 0x00, 0x00, 0x40, 0x40, + 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x70, +}; + +static unsigned char m562[256] = { + 0x07, 0x07, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x07, 0x07, 0x04, 0x04, 0x07, 0x06, 0x07, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x05, 0x04, 0x04, 0x07, 0x06, 0x06, 0x05, 0x07, + 0x04, 0x04, 0x04, 0x05, 0x05, 0x04, 0x04, 0x07, + 0x04, 0x06, 0x06, 0x04, 0x07, 0x05, 0x06, 0x06, + 0x06, 0x05, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, + 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x05, 0x07, 0x04, + 0x04, 0x04, 0x04, 0x06, 0x05, 0x04, 0x04, 0x07, + 0x07, 0x07, 0x06, 0x04, 0x05, 0x04, 0x06, 0x04, + 0x06, 0x04, 0x07, 0x06, 0x07, 0x06, 0x06, 0x04, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x05, 0x05, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x04, 0x04, 0x07, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x04, 0x04, 0x04, 0x07, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x07, 0x04, 0x04, 0x07, + 0x04, 0x04, 0x07, 0x07, 0x04, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x05, 0x04, 0x07, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x06, 0x07, 0x04, 0x05, 0x06, 0x04, + 0x07, 0x05, 0x04, 0x04, 0x05, 0x05, 0x04, 0x06, + 0x04, 0x07, 0x07, 0x04, 0x04, 0x05, 0x05, 0x07, +}; + +static unsigned char m571[256] = { + 0x70, 0x40, 0x40, 0xf0, 0xf0, 0x00, 0x00, 0x40, + 0xf0, 0x70, 0x40, 0xf0, 0x40, 0xf0, 0x00, 0x70, + 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x40, 0xf0, 0x00, + 0xf0, 0x00, 0x40, 0x40, 0x70, 0x40, 0x00, 0xf0, + 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x70, 0x70, + 0xf0, 0x40, 0x40, 0x00, 0x40, 0xf0, 0x40, 0x40, + 0xf0, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x70, + 0x70, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x40, + 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x40, 0xf0, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0xc0, 0xf0, 0x70, + 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0xf0, 0x40, 0xf0, 0x40, + 0x40, 0x70, 0xf0, 0x40, 0x00, 0x40, 0xc0, 0x40, + 0xc0, 0x40, 0x00, 0x40, 0x40, 0xc0, 0x00, 0x40, + 0x00, 0x40, 0x40, 0x40, 0xc0, 0x00, 0x40, 0x70, + 0x00, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x70, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x00, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, + 0xf0, 0x40, 0xf0, 0xf0, 0x70, 0x00, 0x00, 0x40, + 0x40, 0x40, 0x70, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x70, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x70, 0xc0, + 0xc0, 0x00, 0x00, 0xf0, 0x40, 0x00, 0xf0, 0x40, + 0x00, 0x00, 0x70, 0x70, 0x70, 0x40, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x40, 0x40, 0xf0, + 0xf0, 0x40, 0x00, 0x70, 0x40, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, 0xf0, + 0x40, 0xf0, 0xf0, 0x00, 0xf0, 0x40, 0x40, 0x40, +}; + +static unsigned char m572[256] = { + 0x04, 0x06, 0x06, 0x07, 0x07, 0x04, 0x05, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x07, 0x04, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x07, 0x04, 0x04, 0x04, 0x04, + 0x07, 0x07, 0x07, 0x04, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x04, 0x04, 0x07, 0x06, 0x04, 0x04, 0x04, + 0x04, 0x05, 0x05, 0x07, 0x04, 0x04, 0x07, 0x04, + 0x07, 0x06, 0x05, 0x04, 0x04, 0x06, 0x04, 0x07, + 0x04, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x04, 0x04, 0x04, 0x04, 0x05, + 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x07, 0x06, 0x04, 0x07, 0x04, 0x07, 0x04, + 0x07, 0x07, 0x07, 0x07, 0x04, 0x07, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, + 0x04, 0x04, 0x04, 0x07, 0x07, 0x06, 0x04, 0x04, + 0x06, 0x04, 0x07, 0x07, 0x05, 0x05, 0x05, 0x04, + 0x04, 0x04, 0x04, 0x07, 0x07, 0x04, 0x04, 0x06, + 0x04, 0x04, 0x05, 0x07, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x05, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, + 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x07, 0x04, + 0x04, 0x04, 0x05, 0x04, 0x05, 0x06, 0x06, 0x04, + 0x07, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x07, 0x07, 0x04, 0x04, 0x06, 0x06, + 0x04, 0x04, 0x04, 0x07, 0x06, 0x04, 0x07, 0x07, + 0x06, 0x04, 0x07, 0x04, 0x07, 0x07, 0x04, 0x04, + 0x05, 0x05, 0x05, 0x04, 0x06, 0x05, 0x04, 0x07, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x04, 0x04, 0x06, 0x07, 0x06, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x06, 0x07, 0x04, 0x04, +}; + +static unsigned char m581[256] = { + 0xf0, 0x00, 0xf0, 0x40, 0x40, 0xf0, 0xf0, 0x00, + 0xc0, 0xc0, 0xf0, 0x70, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x40, 0x00, 0x70, 0xc0, 0x40, + 0x40, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x40, 0xc0, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x00, 0xf0, + 0xf0, 0xf0, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x00, + 0x00, 0x40, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x40, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0x00, 0xc0, + 0x40, 0xf0, 0x70, 0x00, 0xf0, 0x40, 0x00, 0xf0, + 0xf0, 0x70, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x00, 0xc0, 0xf0, 0x00, 0xc0, 0x00, 0x00, 0x40, + 0x40, 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x40, 0xf0, 0x00, 0x00, 0xc0, 0x00, 0xf0, 0x40, + 0x40, 0x40, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x40, + 0x40, 0xc0, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x40, 0x00, 0x00, 0xf0, 0x40, 0x00, 0x40, 0x70, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x80, 0xf0, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, + 0xf0, 0xc0, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0x40, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x70, 0xf0, 0xf0, 0x40, 0x00, 0xf0, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0x40, 0xf0, 0x00, 0xf0, + 0x40, 0x00, 0x70, 0x00, 0x70, 0x40, 0xc0, 0x00, + 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0x70, + 0xf0, 0xf0, 0x40, 0x00, 0x70, 0x40, 0xf0, 0xf0, + 0x00, 0x40, 0x40, 0x00, 0xf0, 0x70, 0x00, 0x00, + 0x00, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x70, 0xf0, + 0x70, 0x70, 0x70, 0x40, 0x00, 0x00, 0x00, 0x70, + 0x00, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, 0x00, 0x00, +}; + +static unsigned char m582[256] = { + 0x07, 0x06, 0x07, 0x04, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x05, 0x04, 0x04, 0x06, 0x05, 0x04, 0x04, + 0x04, 0x07, 0x04, 0x06, 0x06, 0x06, 0x07, 0x04, + 0x07, 0x07, 0x04, 0x06, 0x07, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0x04, 0x04, + 0x06, 0x04, 0x04, 0x07, 0x05, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x04, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x05, 0x07, 0x06, 0x04, 0x04, 0x04, + 0x06, 0x05, 0x05, 0x04, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, + 0x07, 0x07, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x04, 0x04, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x07, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x07, 0x07, 0x04, 0x05, 0x06, + 0x05, 0x04, 0x04, 0x05, 0x06, 0x04, 0x05, 0x04, + 0x04, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m591[256] = { + 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x70, 0x70, 0x40, 0x40, 0x00, 0x00, 0xf0, + 0x70, 0x00, 0x40, 0x40, 0xc0, 0xf0, 0xf0, 0x00, + 0x70, 0xf0, 0xf0, 0x70, 0xf0, 0x40, 0x00, 0x00, + 0x00, 0x40, 0xf0, 0x40, 0x40, 0x70, 0x00, 0xf0, + 0x40, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, 0xf0, 0x40, + 0x40, 0xf0, 0x70, 0x40, 0x00, 0x40, 0x40, 0xf0, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x00, 0x00, 0x00, 0x40, 0xf0, 0x00, 0x40, 0xf0, + 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, + 0xf0, 0xf0, 0x40, 0x40, 0xf0, 0xf0, 0x00, 0xf0, + 0x70, 0x40, 0xf0, 0x40, 0x00, 0x40, 0x40, 0x40, + 0xf0, 0x40, 0xf0, 0x40, 0x00, 0x70, 0x00, 0xf0, + 0x70, 0x70, 0xf0, 0xc0, 0xf0, 0xc0, 0xf0, 0x40, + 0x00, 0x00, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0x00, + 0xf0, 0x40, 0x00, 0x40, 0x40, 0xf0, 0x00, 0x00, + 0x00, 0x70, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x40, 0x40, 0x70, 0x40, 0x00, + 0x00, 0x00, 0x40, 0xf0, 0x00, 0x40, 0xf0, 0xc0, + 0x00, 0xf0, 0x00, 0x70, 0x00, 0x70, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x70, 0x40, 0xf0, 0x00, 0x40, + 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x70, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0x40, 0xf0, 0x40, 0x00, 0xf0, 0x00, + 0x00, 0x40, 0x00, 0xc0, 0x40, 0x00, 0xf0, 0x00, + 0x40, 0xf0, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x00, + 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0xc0, 0x40, 0x40, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x70, 0xf0, 0x40, + 0xf0, 0x00, 0xf0, 0x70, 0x80, 0x00, 0xc0, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x40, 0x00, 0x70, 0x40, + 0x80, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, +}; + +static unsigned char m592[256] = { + 0x04, 0x04, 0x05, 0x06, 0x05, 0x04, 0x06, 0x05, + 0x04, 0x04, 0x04, 0x04, 0x06, 0x07, 0x06, 0x07, + 0x04, 0x04, 0x06, 0x04, 0x07, 0x07, 0x07, 0x06, + 0x04, 0x07, 0x07, 0x04, 0x07, 0x04, 0x04, 0x05, + 0x06, 0x04, 0x06, 0x04, 0x07, 0x07, 0x04, 0x07, + 0x04, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, + 0x04, 0x07, 0x04, 0x04, 0x05, 0x04, 0x04, 0x07, + 0x07, 0x05, 0x05, 0x04, 0x07, 0x04, 0x06, 0x04, + 0x06, 0x05, 0x05, 0x04, 0x07, 0x06, 0x04, 0x07, + 0x07, 0x07, 0x06, 0x05, 0x04, 0x04, 0x07, 0x07, + 0x06, 0x07, 0x04, 0x06, 0x07, 0x07, 0x05, 0x07, + 0x07, 0x04, 0x07, 0x04, 0x06, 0x04, 0x04, 0x04, + 0x07, 0x06, 0x07, 0x04, 0x04, 0x05, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, 0x07, 0x06, + 0x07, 0x07, 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, + 0x05, 0x04, 0x07, 0x04, 0x04, 0x07, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x07, 0x04, 0x04, 0x07, 0x07, + 0x06, 0x07, 0x04, 0x04, 0x04, 0x06, 0x07, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x07, 0x05, 0x05, 0x05, 0x04, 0x04, 0x07, 0x07, + 0x04, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x07, 0x06, 0x07, 0x06, 0x06, 0x07, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x06, 0x05, + 0x07, 0x04, 0x07, 0x06, 0x07, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, 0x06, 0x04, + 0x07, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x05, 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, +}; + +static unsigned char m5a1[256] = { + 0x40, 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, + 0x00, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x70, 0x80, 0xf0, 0x00, 0x40, 0xf0, + 0xf0, 0x00, 0x00, 0x40, 0x40, 0xf0, 0x00, 0x40, + 0x40, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x00, 0x70, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x70, 0xf0, 0x00, 0x00, 0x40, 0x40, 0xf0, 0x40, + 0x40, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0xf0, 0x40, 0x00, 0x40, 0xf0, 0x40, + 0x00, 0x00, 0x70, 0x00, 0x70, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x40, 0xf0, 0xf0, 0x40, 0x00, 0x40, 0x40, + 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x40, 0x00, 0x40, 0x40, 0x70, 0x70, 0x70, 0x40, + 0x00, 0xf0, 0xf0, 0x00, 0xc0, 0x00, 0x40, 0x00, + 0x40, 0xf0, 0x00, 0x70, 0xf0, 0x00, 0x00, 0x40, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, + 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x40, 0xf0, 0x00, 0x70, 0x00, 0x40, 0xf0, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x70, 0x70, 0x00, 0x40, 0x00, 0x00, +}; + +static unsigned char m5a2[256] = { + 0x06, 0x07, 0x04, 0x07, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x07, 0x06, 0x04, 0x07, 0x04, 0x04, 0x06, + 0x04, 0x07, 0x04, 0x07, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x07, 0x04, 0x06, 0x07, + 0x07, 0x04, 0x04, 0x07, 0x04, 0x07, 0x04, 0x04, + 0x04, 0x07, 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x04, 0x05, 0x05, 0x06, 0x05, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x07, 0x04, 0x06, 0x04, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, + 0x06, 0x07, 0x07, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x04, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x06, 0x07, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x07, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, 0x04, 0x07, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x05, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x07, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x07, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x04, 0x04, + 0x04, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x04, + 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x05, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, +}; + +static unsigned char m5b1[256] = { + 0x40, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x40, 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x70, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x70, 0x40, 0x00, 0x00, + 0x70, 0x00, 0x70, 0x00, 0x40, 0x00, 0x70, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, + 0xf0, 0x40, 0x00, 0xf0, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0x40, 0x00, 0xf0, 0xf0, 0x40, 0xf0, + 0xf0, 0x00, 0xf0, 0x70, 0xf0, 0xf0, 0x40, 0xf0, + 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x70, 0x70, 0x00, + 0x40, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x40, + 0xf0, 0xf0, 0x00, 0x70, 0x00, 0xf0, 0x00, 0x00, + 0xf0, 0x00, 0xf0, 0x00, 0xc0, 0x40, 0x40, 0x40, + 0x70, 0x40, 0x00, 0x70, 0x40, 0xf0, 0x40, 0xf0, + 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0x70, 0x40, 0xf0, + 0x40, 0x40, 0x00, 0xc0, 0x40, 0xf0, 0xc0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0x00, 0x70, + 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, + 0x40, 0x40, 0x00, 0x00, 0xc0, 0x40, 0xf0, 0x40, + 0xf0, 0x40, 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, + 0xf0, 0xf0, 0x40, 0x00, 0x40, 0x00, 0x00, 0xf0, + 0xc0, 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0x00, 0x70, 0x00, 0x00, 0xf0, 0x40, 0x00, 0x40, + 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0x00, 0x40, 0xc0, + 0x40, 0x40, 0x40, 0x70, 0x00, 0x70, 0xf0, 0xf0, + 0x40, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x00, 0xf0, 0x80, 0x00, 0xf0, 0xc0, + 0x70, 0x40, 0x00, 0x70, 0x40, 0xf0, 0xf0, 0x00, + 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x70, 0x70, +}; + +static unsigned char m5b2[256] = { + 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, 0x07, 0x07, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x04, 0x07, 0x04, 0x04, 0x05, + 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x04, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x07, 0x04, 0x07, 0x07, 0x07, 0x06, 0x07, + 0x07, 0x05, 0x07, 0x07, 0x07, 0x07, 0x04, 0x07, + 0x04, 0x04, 0x07, 0x07, 0x07, 0x07, 0x05, 0x04, + 0x04, 0x07, 0x05, 0x06, 0x07, 0x04, 0x06, 0x04, + 0x07, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x04, 0x07, 0x04, 0x06, + 0x05, 0x07, 0x04, 0x07, 0x07, 0x07, 0x04, 0x07, + 0x07, 0x07, 0x04, 0x07, 0x07, 0x04, 0x06, 0x07, + 0x04, 0x04, 0x06, 0x07, 0x04, 0x07, 0x04, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x04, + 0x05, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x04, 0x05, 0x05, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x04, 0x04, 0x07, 0x07, 0x07, 0x07, 0x04, + 0x07, 0x07, 0x04, 0x04, 0x04, 0x05, 0x05, 0x07, + 0x06, 0x06, 0x07, 0x04, 0x07, 0x07, 0x07, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, 0x04, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x05, 0x07, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, + 0x07, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x07, 0x05, 0x07, 0x05, 0x05, 0x04, 0x04, 0x05, +}; + +static unsigned char m5c1[256] = { + 0x00, 0xf0, 0x70, 0x00, 0xf0, 0x70, 0x70, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0xf0, + 0x00, 0xf0, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x40, + 0x00, 0x80, 0x70, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x70, 0x00, 0x70, 0x40, 0xf0, 0x00, 0x40, 0x00, + 0xf0, 0x40, 0x00, 0x40, 0x40, 0x70, 0x40, 0x00, + 0x40, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, 0xf0, + 0xf0, 0x70, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, + 0xf0, 0x00, 0x70, 0xf0, 0x00, 0xf0, 0xf0, 0x70, + 0x70, 0xf0, 0x00, 0x70, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x40, 0x40, 0x80, 0x40, 0x00, 0x70, 0x00, + 0xf0, 0x70, 0xc0, 0x40, 0xf0, 0xf0, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x00, 0xf0, 0x40, 0x70, 0xf0, + 0x40, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x70, 0x00, + 0x00, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x40, 0x00, 0x70, 0x00, 0x00, 0x40, + 0xf0, 0xf0, 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, + 0x40, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x40, 0x00, + 0x70, 0xf0, 0x40, 0xf0, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0xf0, 0x40, 0xc0, 0x70, 0xf0, + 0xf0, 0x00, 0xc0, 0x70, 0x70, 0x00, 0xf0, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x70, 0x70, 0x00, 0x00, 0x70, 0x40, 0xf0, + 0xf0, 0x40, 0x40, 0x00, 0xc0, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x70, 0xf0, 0x00, 0xf0, 0x00, 0x00, +}; + +static unsigned char m5c2[256] = { + 0x04, 0x07, 0x04, 0x06, 0x07, 0x04, 0x05, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x04, 0x05, 0x07, 0x07, 0x04, + 0x05, 0x04, 0x07, 0x04, 0x05, 0x05, 0x04, 0x06, + 0x04, 0x04, 0x07, 0x04, 0x07, 0x07, 0x04, 0x05, + 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x04, 0x04, + 0x06, 0x07, 0x04, 0x06, 0x05, 0x04, 0x04, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x07, 0x07, + 0x07, 0x07, 0x05, 0x04, 0x06, 0x07, 0x06, 0x06, + 0x07, 0x05, 0x05, 0x07, 0x06, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x04, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x07, 0x04, 0x04, 0x06, 0x06, 0x05, 0x04, + 0x07, 0x05, 0x06, 0x07, 0x06, 0x07, 0x05, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x07, 0x07, + 0x04, 0x07, 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, + 0x04, 0x07, 0x07, 0x06, 0x06, 0x04, 0x06, 0x05, + 0x04, 0x05, 0x05, 0x04, 0x04, 0x04, 0x06, 0x04, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x07, 0x04, 0x07, 0x06, 0x07, + 0x07, 0x04, 0x04, 0x04, 0x04, 0x05, 0x04, 0x05, + 0x04, 0x05, 0x04, 0x04, 0x05, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x04, 0x05, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, + 0x07, 0x04, 0x07, 0x04, 0x06, 0x07, 0x06, 0x04, + 0x07, 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x07, 0x04, 0x06, 0x04, 0x06, +}; + +static unsigned char m5d1[256] = { + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0xf0, + 0x00, 0x00, 0x00, 0x70, 0x00, 0xc0, 0xf0, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0xf0, 0x70, 0xf0, 0xf0, + 0x70, 0xf0, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x70, 0x40, 0x40, 0x00, 0x40, 0xc0, + 0x00, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x70, 0x00, + 0xf0, 0x40, 0x70, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, + 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0xf0, 0x40, 0x00, 0xf0, + 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x70, 0x40, 0x70, 0x00, 0x00, 0xf0, + 0x40, 0x00, 0x40, 0xf0, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x40, + 0xc0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x80, 0x40, 0x70, 0x00, 0x70, 0x00, + 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x70, + 0xc0, 0x40, 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x70, 0x00, 0x40, 0x70, 0xf0, 0x40, 0x00, + 0x40, 0x00, 0xf0, 0x70, 0x00, 0x00, 0xf0, 0x00, + 0x40, 0x40, 0x00, 0x70, 0x00, 0xf0, 0xf0, 0x00, + 0x40, 0xf0, 0x80, 0x70, 0x40, 0xf0, 0xf0, 0xf0, + 0xf0, 0x40, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0x00, 0xf0, + 0x40, 0x40, 0x00, 0x70, 0x00, 0xf0, 0xf0, 0x00, +}; + +static unsigned char m5d2[256] = { + 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x07, 0x07, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x07, 0x04, 0x07, 0x06, + 0x04, 0x06, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x04, 0x04, 0x04, 0x05, 0x07, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, 0x05, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x07, + 0x04, 0x06, 0x07, 0x07, 0x07, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, + 0x05, 0x06, 0x04, 0x05, 0x04, 0x05, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x04, 0x07, 0x07, 0x04, 0x04, 0x07, + 0x04, 0x06, 0x06, 0x04, 0x05, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x07, 0x06, 0x04, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x07, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x05, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x04, 0x05, 0x04, 0x07, 0x07, 0x06, + 0x06, 0x07, 0x07, 0x04, 0x04, 0x07, 0x07, 0x07, + 0x07, 0x05, 0x04, 0x07, 0x04, 0x04, 0x07, 0x05, + 0x06, 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, 0x07, + 0x04, 0x06, 0x04, 0x04, 0x04, 0x07, 0x07, 0x06, +}; + +static unsigned char m5e1[256] = { + 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x40, + 0x00, 0x00, 0x00, 0x70, 0xf0, 0x40, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0x40, 0x40, 0xf0, 0x00, + 0x40, 0xf0, 0x70, 0xf0, 0x00, 0xf0, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x40, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x40, 0x70, + 0x70, 0x00, 0x40, 0xf0, 0x00, 0x40, 0xf0, 0x70, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x80, + 0xf0, 0x00, 0x00, 0x70, 0xf0, 0xf0, 0x00, 0xf0, + 0x00, 0x40, 0x00, 0x40, 0xf0, 0x00, 0x70, 0x00, + 0x40, 0x40, 0x00, 0x00, 0x70, 0xf0, 0x40, 0x70, + 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, 0xf0, + 0x00, 0xf0, 0xf0, 0xf0, 0x70, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x40, 0x00, 0xf0, 0xf0, 0xf0, 0x70, 0x70, 0x80, + 0xf0, 0xf0, 0x70, 0xf0, 0xf0, 0xf0, 0xf0, 0x70, + 0x40, 0x70, 0x00, 0x70, 0xf0, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x40, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x70, 0xf0, + 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x40, 0x00, 0x40, 0x40, 0xf0, 0xf0, + 0x40, 0x00, 0x40, 0xf0, 0x40, 0xf0, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x40, 0x00, 0xf0, 0xf0, 0xf0, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc0, 0x40, + 0x00, 0x70, 0xf0, 0x70, 0x00, 0x00, 0x40, 0x00, + 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0x00, 0x40, 0x70, + 0xf0, 0x40, 0x40, 0xf0, 0x40, 0x40, 0xf0, 0x00, + 0x00, 0x00, 0xf0, 0xf0, 0x40, 0x70, 0x40, 0xf0, + 0xf0, 0x70, 0xf0, 0xf0, 0x00, 0x40, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x40, 0xf0, 0x00, 0x00, 0x00, + 0x70, 0x70, 0x00, 0xf0, 0x70, 0x00, 0xf0, 0xf0, + 0x70, 0x00, 0xf0, 0xf0, 0x70, 0x00, 0x70, 0x70, +}; + +static unsigned char m5e2[256] = { + 0x04, 0x05, 0x07, 0x07, 0x06, 0x05, 0x07, 0x04, + 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, 0x06, 0x05, + 0x05, 0x07, 0x04, 0x04, 0x07, 0x07, 0x07, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x05, 0x07, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x07, 0x05, 0x04, + 0x04, 0x05, 0x04, 0x06, 0x06, 0x04, 0x06, 0x07, + 0x07, 0x04, 0x04, 0x05, 0x05, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x05, 0x06, 0x07, 0x07, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x04, 0x06, 0x07, 0x07, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, 0x05, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x07, 0x07, 0x06, 0x07, 0x04, + 0x07, 0x06, 0x05, 0x07, 0x07, 0x07, 0x06, 0x05, + 0x07, 0x04, 0x06, 0x04, 0x07, 0x04, 0x05, 0x07, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x07, + 0x05, 0x05, 0x04, 0x05, 0x05, 0x07, 0x07, 0x07, + 0x04, 0x05, 0x07, 0x06, 0x07, 0x04, 0x05, 0x05, + 0x07, 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x04, 0x04, 0x04, 0x07, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x07, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x05, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x05, 0x04, 0x07, 0x07, + 0x04, 0x04, 0x07, 0x04, 0x04, 0x04, 0x07, 0x07, +}; + +static unsigned char m5f1[256] = { + 0x00, 0xf0, 0x40, 0x70, 0xf0, 0x00, 0x40, 0x40, + 0x40, 0x70, 0xf0, 0x70, 0x70, 0x70, 0x40, 0xf0, + 0x70, 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, + 0xf0, 0x40, 0x00, 0xf0, 0x40, 0x40, 0x00, 0xf0, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x70, 0xf0, 0xf0, + 0x40, 0xf0, 0x00, 0x40, 0x40, 0x70, 0x40, 0x70, + 0x40, 0xf0, 0x00, 0x00, 0x40, 0xf0, 0x40, 0x70, + 0x70, 0x00, 0x80, 0x40, 0xf0, 0x40, 0x70, 0x40, + 0x40, 0x70, 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, + 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x40, 0xf0, 0x00, + 0x40, 0x70, 0x00, 0x70, 0x40, 0x00, 0xf0, 0xf0, + 0x40, 0xf0, 0x00, 0xc0, 0x70, 0x70, 0x00, 0x00, + 0x40, 0x70, 0xf0, 0x40, 0x40, 0x00, 0xf0, 0xc0, + 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x40, + 0xf0, 0xf0, 0x40, 0x70, 0x40, 0x40, 0x00, 0xf0, + 0x40, 0xf0, 0x40, 0x00, 0xf0, 0x40, 0x40, 0xf0, + 0xf0, 0xf0, 0x70, 0x70, 0x70, 0xf0, 0x00, 0xf0, + 0x70, 0x40, 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0x40, + 0xf0, 0xf0, 0xf0, 0x70, 0x00, 0x00, 0x40, 0xf0, + 0xf0, 0xf0, 0x00, 0x00, 0x40, 0x40, 0xf0, 0x00, + 0xf0, 0xf0, 0x40, 0x00, 0x40, 0x00, 0x00, 0x40, + 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0x70, 0xf0, 0x40, + 0x40, 0x40, 0x00, 0x70, 0x70, 0x80, 0x00, 0x80, + 0x40, 0xf0, 0x00, 0x00, 0x70, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x40, 0xf0, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0xf0, 0xf0, + 0xf0, 0xf0, 0x00, 0x00, 0x70, 0x70, 0x40, 0x00, + 0xf0, 0x40, 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x40, + 0x70, 0x70, 0x40, 0x40, 0x00, 0xf0, 0x40, 0x00, + 0x70, 0x00, 0x40, 0x70, 0x40, 0xf0, 0x00, 0xf0, +}; + +static unsigned char m5f2[256] = { + 0x05, 0x07, 0x07, 0x05, 0x07, 0x06, 0x04, 0x06, + 0x07, 0x04, 0x07, 0x07, 0x04, 0x04, 0x04, 0x07, + 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, + 0x07, 0x04, 0x06, 0x07, 0x04, 0x06, 0x04, 0x07, + 0x05, 0x04, 0x06, 0x06, 0x06, 0x05, 0x07, 0x07, + 0x06, 0x07, 0x05, 0x04, 0x04, 0x07, 0x06, 0x05, + 0x06, 0x07, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x05, 0x05, 0x04, 0x07, 0x04, 0x04, 0x04, + 0x07, 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x05, 0x04, 0x05, 0x05, 0x06, 0x05, 0x07, 0x07, + 0x07, 0x06, 0x04, 0x04, 0x04, 0x07, 0x04, 0x04, + 0x04, 0x05, 0x07, 0x04, 0x07, 0x06, 0x05, 0x06, + 0x04, 0x07, 0x07, 0x06, 0x07, 0x07, 0x04, 0x06, + 0x07, 0x07, 0x04, 0x07, 0x06, 0x04, 0x06, 0x07, + 0x06, 0x07, 0x04, 0x05, 0x07, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x04, 0x05, 0x07, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, + 0x07, 0x06, 0x07, 0x04, 0x04, 0x05, 0x06, 0x07, + 0x07, 0x07, 0x04, 0x06, 0x07, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x07, 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x04, 0x04, 0x06, 0x04, 0x04, 0x07, 0x06, 0x07, + 0x04, 0x06, 0x04, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x07, 0x05, 0x07, 0x05, 0x04, + 0x04, 0x07, 0x04, 0x04, 0x07, 0x07, 0x04, 0x07, + 0x07, 0x07, 0x07, 0x04, 0x06, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x04, 0x04, 0x07, 0x06, 0x04, + 0x07, 0x07, 0x04, 0x06, 0x07, 0x06, 0x04, 0x05, + 0x06, 0x04, 0x07, 0x07, 0x04, 0x07, 0x07, 0x06, + 0x04, 0x07, 0x04, 0x06, 0x06, 0x07, 0x04, 0x06, + 0x07, 0x04, 0x06, 0x07, 0x04, 0x07, 0x05, 0x07, +}; + +static unsigned char m601[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x70, 0xf0, + 0x70, 0x00, 0xf0, 0x40, 0x40, 0x70, 0xf0, 0x40, + 0x40, 0x70, 0x40, 0x70, 0xf0, 0xf0, 0x00, 0x40, + 0xf0, 0xf0, 0x00, 0x00, 0x40, 0xf0, 0x70, 0xf0, + 0xf0, 0x70, 0xf0, 0x70, 0x00, 0x40, 0x00, 0xf0, + 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x70, 0x40, + 0x40, 0x40, 0x70, 0x70, 0x40, 0xf0, 0x00, 0x00, + 0xf0, 0x40, 0xf0, 0x00, 0x40, 0xf0, 0x40, 0x40, + 0x00, 0xf0, 0x70, 0x00, 0x00, 0xc0, 0x00, 0x70, + 0x70, 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x40, + 0xf0, 0xf0, 0xf0, 0x70, 0xf0, 0xf0, 0x00, 0xf0, + 0xf0, 0x40, 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x70, 0x40, 0x70, 0x70, 0x80, 0x40, 0x00, + 0x40, 0xf0, 0x40, 0x70, 0xf0, 0xf0, 0x40, 0x00, + 0x00, 0x40, 0x70, 0x40, 0xf0, 0x40, 0xf0, 0x70, + 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x40, 0xf0, + 0xf0, 0x00, 0x40, 0xf0, 0xc0, 0x40, 0x70, 0xf0, + 0x40, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x40, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, 0x40, + 0xf0, 0x00, 0x00, 0x40, 0xf0, 0xf0, 0x40, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x40, 0xf0, 0x70, 0xf0, + 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, + 0x00, 0xf0, 0x00, 0x70, 0x40, 0x40, 0x00, 0x00, + 0x70, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0x40, 0xf0, + 0xf0, 0xf0, 0x40, 0x70, 0x00, 0x40, 0x00, 0x70, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0x40, 0xf0, 0x70, 0x40, 0xf0, 0x70, + 0x40, 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0x00, 0x00, +}; + +static unsigned char m602[256] = { + 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, + 0x04, 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, + 0x04, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x04, + 0x07, 0x07, 0x06, 0x04, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, + 0x04, 0x06, 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, + 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x05, 0x06, 0x07, 0x04, 0x04, + 0x07, 0x04, 0x07, 0x06, 0x06, 0x07, 0x04, 0x04, + 0x06, 0x07, 0x07, 0x06, 0x04, 0x07, 0x06, 0x06, + 0x04, 0x04, 0x07, 0x07, 0x07, 0x06, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x05, 0x04, 0x04, 0x05, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x07, + 0x06, 0x06, 0x04, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x04, 0x07, 0x07, 0x06, 0x04, + 0x06, 0x04, 0x07, 0x04, 0x07, 0x06, 0x07, 0x06, + 0x04, 0x04, 0x07, 0x07, 0x06, 0x07, 0x04, 0x07, + 0x07, 0x04, 0x06, 0x07, 0x04, 0x04, 0x05, 0x04, + 0x07, 0x04, 0x04, 0x01, 0x01, 0x01, 0x04, 0x01, + 0x06, 0x07, 0x07, 0x04, 0x07, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x04, 0x06, 0x06, 0x07, 0x04, 0x04, + 0x07, 0x06, 0x07, 0x06, 0x07, 0x07, 0x04, 0x07, + 0x07, 0x06, 0x06, 0x04, 0x06, 0x04, 0x07, 0x05, + 0x05, 0x05, 0x04, 0x01, 0x01, 0x01, 0x05, 0x01, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x06, 0x06, +}; + +static unsigned char m611[256] = { + 0x70, 0xf0, 0x40, 0x70, 0x00, 0x00, 0xf0, 0x40, + 0xf0, 0xf0, 0x40, 0x00, 0x40, 0xf0, 0xf0, 0xf0, + 0x40, 0x40, 0x40, 0x40, 0x40, 0xf0, 0x40, 0x40, + 0x00, 0x40, 0xf0, 0xf0, 0x40, 0x00, 0x40, 0xf0, + 0x00, 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x70, 0x00, 0x40, 0x40, 0x70, 0x00, 0x00, 0x00, + 0xc0, 0x40, 0x00, 0x00, 0xf0, 0x40, 0x40, 0xc0, + 0x00, 0x40, 0x00, 0x00, 0xf0, 0x70, 0xf0, 0xf0, + 0x00, 0x40, 0xf0, 0x00, 0xf0, 0x40, 0x40, 0xf0, + 0xf0, 0x40, 0xf0, 0xf0, 0xf0, 0x70, 0x70, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, + 0xf0, 0xf0, 0x70, 0x00, 0x00, 0xf0, 0x40, 0xf0, + 0x40, 0x00, 0xf0, 0xf0, 0x80, 0x70, 0x00, 0xf0, + 0xf0, 0x00, 0x00, 0xf0, 0x40, 0x00, 0xf0, 0x70, + 0xf0, 0x70, 0x40, 0x70, 0x70, 0x70, 0xf0, 0xf0, + 0x40, 0x00, 0x00, 0x40, 0x40, 0x80, 0xf0, 0x40, + 0x40, 0xc0, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x70, + 0x00, 0x00, 0xf0, 0x40, 0x00, 0x40, 0xf0, 0x00, + 0xf0, 0xf0, 0x40, 0x40, 0xf0, 0x00, 0x70, 0x40, + 0xc0, 0xf0, 0xf0, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x00, 0xf0, + 0x40, 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0xf0, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x40, 0x40, 0xf0, 0x00, 0x40, 0x00, 0xf0, 0x00, + 0x40, 0x40, 0x40, 0xf0, 0x00, 0x00, 0x70, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0x70, 0x40, 0x40, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x70, 0x00, 0x40, 0xf0, 0x40, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x00, 0x00, 0xf0, 0x00, 0x70, 0x00, 0xf0, 0xf0, + 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x70, 0x70, 0xf0, +}; + +static unsigned char m612[256] = { + 0x07, 0x07, 0x04, 0x06, 0x06, 0x06, 0x07, 0x04, + 0x07, 0x07, 0x06, 0x06, 0x04, 0x07, 0x07, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, 0x04, 0x07, + 0x05, 0x04, 0x04, 0x07, 0x01, 0x04, 0x01, 0x07, + 0x06, 0x06, 0x04, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, 0x07, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, + 0x04, 0x01, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x07, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x04, + 0x04, 0x01, 0x01, 0x04, 0x01, 0x04, 0x06, 0x04, + 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x00, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, +}; + +static unsigned char m621[256] = { + 0xf0, 0x40, 0x00, 0x40, 0x40, 0x00, 0x00, 0xc0, + 0xf0, 0x70, 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0x00, + 0xf0, 0xf0, 0xf0, 0x40, 0x70, 0x40, 0xf0, 0x00, + 0x00, 0x00, 0xf0, 0x70, 0x40, 0x70, 0x70, 0xf0, + 0x40, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x70, 0x40, + 0x00, 0x40, 0xf0, 0x40, 0x00, 0x00, 0xf0, 0x70, + 0xf0, 0x80, 0x70, 0x70, 0xf0, 0x00, 0x80, 0x00, + 0x70, 0x40, 0x00, 0x70, 0x00, 0x40, 0x80, 0xf0, + 0xf0, 0xf0, 0x40, 0x40, 0x40, 0x00, 0x40, 0xf0, + 0xf0, 0xf0, 0x00, 0xf0, 0x40, 0xf0, 0x70, 0x00, + 0x40, 0x40, 0x40, 0xf0, 0x40, 0x70, 0x40, 0x00, + 0xf0, 0x00, 0x40, 0x70, 0x40, 0x00, 0x70, 0x00, + 0x70, 0x00, 0x00, 0x70, 0x40, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0xf0, 0x40, + 0x00, 0xf0, 0x00, 0x40, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0xf0, 0x40, 0x70, 0xf0, + 0xf0, 0x00, 0x70, 0x70, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x40, 0xf0, 0xf0, 0x70, 0x70, 0xf0, 0x70, 0xf0, + 0xf0, 0x00, 0x00, 0xf0, 0x70, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x00, 0xf0, 0x70, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x40, 0x00, 0xf0, 0x40, 0x40, + 0x00, 0xf0, 0x40, 0x70, 0xf0, 0xf0, 0x40, 0x40, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0x70, 0x70, 0xf0, + 0xf0, 0xf0, 0x70, 0x00, 0xf0, 0xf0, 0x40, 0xf0, + 0xf0, 0x70, 0xf0, 0xf0, 0xf0, 0x40, 0xc0, 0xf0, + 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0x70, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, + 0x00, 0xf0, 0x40, 0xf0, 0x40, 0x70, 0x70, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0xf0, 0xf0, +}; + +static unsigned char m622[256] = { + 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x01, 0x06, + 0x07, 0x06, 0x07, 0x01, 0x07, 0x07, 0x07, 0x05, + 0x07, 0x07, 0x07, 0x04, 0x06, 0x07, 0x07, 0x01, + 0x05, 0x06, 0x07, 0x07, 0x04, 0x04, 0x04, 0x07, + 0x06, 0x07, 0x07, 0x06, 0x07, 0x07, 0x04, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x05, 0x06, 0x07, 0x04, + 0x06, 0x04, 0x06, 0x07, 0x07, 0x04, 0x06, 0x05, + 0x04, 0x04, 0x06, 0x04, 0x04, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x00, 0x04, 0x06, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x05, 0x07, 0x07, 0x04, + 0x06, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x04, + 0x07, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x05, + 0x04, 0x01, 0x01, 0x01, 0x01, 0x07, 0x07, 0x07, + 0x07, 0x06, 0x06, 0x07, 0x06, 0x04, 0x07, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, + 0x07, 0x06, 0x04, 0x06, 0x07, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x04, 0x05, 0x05, 0x04, 0x04, 0x04, 0x01, + 0x01, 0x01, 0x01, 0x04, 0x05, 0x05, 0x04, 0x04, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x07, 0x04, 0x07, 0x07, 0x07, 0x06, 0x07, + 0x04, 0x04, 0x07, 0x04, 0x07, 0x05, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, + 0x07, 0x06, 0x07, 0x07, 0x07, 0x04, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, 0x05, + 0x04, 0x04, 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x04, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x07, 0x06, 0x07, 0x07, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, +}; + +static unsigned char m631[256] = { + 0x00, 0xf0, 0x70, 0x40, 0x40, 0x00, 0x00, 0xf0, + 0x70, 0xf0, 0x40, 0x40, 0x70, 0x40, 0x00, 0x00, + 0x40, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x70, 0x40, 0x40, 0xf0, 0x00, 0x40, 0x00, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x40, 0xf0, 0x80, 0x40, 0xf0, 0xf0, 0x70, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, + 0x00, 0xf0, 0x40, 0x40, 0xf0, 0x70, 0x40, 0xf0, + 0xf0, 0x00, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x70, + 0x40, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0xf0, + 0xf0, 0x70, 0x00, 0x70, 0x40, 0x40, 0xf0, 0x00, + 0x00, 0x40, 0xf0, 0x00, 0x40, 0x40, 0x70, 0xf0, + 0x40, 0x00, 0xf0, 0xf0, 0x40, 0x40, 0x00, 0xc0, + 0x70, 0x00, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x40, + 0xf0, 0xf0, 0x40, 0x00, 0xf0, 0x00, 0x70, 0x70, + 0x40, 0x00, 0xf0, 0x00, 0x40, 0x40, 0xf0, 0x00, + 0xf0, 0x40, 0x40, 0xf0, 0x00, 0x00, 0x40, 0x70, + 0xf0, 0xf0, 0xf0, 0x70, 0x40, 0xf0, 0x40, 0xf0, + 0xf0, 0xf0, 0xf0, 0x70, 0x70, 0x40, 0x40, 0x40, + 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x40, 0x70, 0x00, + 0xf0, 0x40, 0x00, 0x70, 0xf0, 0x40, 0xf0, 0x00, + 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0xf0, + 0xf0, 0x40, 0x70, 0x40, 0x40, 0x40, 0xf0, 0x00, + 0x00, 0x00, 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x40, 0xf0, 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x70, 0x40, 0x00, 0x40, 0x80, 0xf0, 0x00, + 0x00, 0x00, 0x40, 0x40, 0xf0, 0x40, 0xf0, 0x80, + 0x40, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m632[256] = { + 0x06, 0x07, 0x07, 0x06, 0x04, 0x04, 0x04, 0x07, + 0x07, 0x07, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, 0x07, 0x04, + 0x00, 0x04, 0x01, 0x05, 0x00, 0x01, 0x01, 0x05, + 0x01, 0x05, 0x01, 0x05, 0x01, 0x01, 0x00, 0x00, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x07, + 0x04, 0x04, 0x07, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x07, 0x07, 0x06, + 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x06, 0x04, 0x04, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x01, 0x01, + 0x04, 0x01, 0x01, 0x01, 0x04, 0x06, 0x04, 0x07, + 0x06, 0x07, 0x04, 0x06, 0x04, 0x07, 0x07, 0x06, + 0x06, 0x07, 0x06, 0x04, 0x04, 0x06, 0x07, 0x07, + 0x06, 0x04, 0x07, 0x07, 0x06, 0x06, 0x04, 0x04, + 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x07, + 0x07, 0x07, 0x07, 0x04, 0x07, 0x06, 0x07, 0x07, + 0x07, 0x06, 0x07, 0x04, 0x06, 0x04, 0x07, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x07, 0x04, 0x07, + 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, + 0x07, 0x06, 0x04, 0x01, 0x01, 0x00, 0x04, 0x01, + 0x01, 0x00, 0x05, 0x00, 0x01, 0x06, 0x07, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x04, 0x07, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, + 0x07, 0x07, 0x04, 0x07, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x04, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, + 0x05, 0x06, 0x04, 0x00, 0x00, 0x01, 0x04, 0x01, +}; + +static unsigned char m641[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x40, 0x40, 0x00, 0x00, 0xf0, 0x00, 0xf0, + 0x40, 0x00, 0x40, 0x70, 0xc0, 0x00, 0xf0, 0xf0, + 0x40, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x00, + 0x40, 0x00, 0xc0, 0x00, 0x40, 0x40, 0x70, 0x00, + 0x70, 0x40, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0xf0, 0x40, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x70, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, + 0xc0, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x70, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x00, 0xf0, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x70, 0x00, + 0xf0, 0x80, 0xf0, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x40, 0xc0, 0xf0, 0xf0, 0x00, 0x70, 0x00, 0x00, + 0x40, 0x40, 0xf0, 0x40, 0x00, 0x40, 0xf0, 0x40, + 0x00, 0x40, 0x00, 0x40, 0xf0, 0xf0, 0x40, 0x00, + 0x40, 0x70, 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0x00, + 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0xf0, 0x70, 0x40, 0x40, 0x40, + 0x00, 0xf0, 0x70, 0x00, 0xc0, 0xf0, 0x00, 0xf0, + 0x00, 0x40, 0xc0, 0x40, 0x40, 0xf0, 0xc0, 0x00, + 0x40, 0x40, 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x40, + 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xf0, 0xf0, 0x70, 0x40, 0xc0, 0xf0, 0xf0, + 0x00, 0x40, 0x40, 0x00, 0xf0, 0x40, 0x00, 0x70, + 0x40, 0x70, 0xf0, 0x00, 0xf0, 0x40, 0x70, 0x40, + 0x00, 0x00, 0xf0, 0x40, 0x00, 0x70, 0xf0, 0x40, +}; + +static unsigned char m642[256] = { + 0x01, 0x01, 0x01, 0x04, 0x00, 0x01, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x07, 0x07, 0x04, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x05, 0x04, 0x04, 0x07, 0x06, 0x07, + 0x06, 0x07, 0x00, 0x06, 0x01, 0x01, 0x05, 0x05, + 0x01, 0x04, 0x01, 0x06, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x04, 0x04, 0x04, + 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x07, 0x04, 0x01, 0x07, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x05, 0x07, 0x06, 0x04, 0x07, 0x07, 0x06, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, 0x04, + 0x04, 0x07, 0x04, 0x06, 0x07, 0x07, 0x07, 0x04, + 0x07, 0x06, 0x06, 0x06, 0x04, 0x01, 0x04, 0x01, + 0x01, 0x04, 0x01, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x05, 0x06, 0x07, 0x06, 0x06, 0x07, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x07, 0x07, 0x06, + 0x07, 0x04, 0x07, 0x04, 0x06, 0x04, 0x06, 0x07, + 0x07, 0x06, 0x06, 0x06, 0x04, 0x00, 0x01, 0x04, + 0x06, 0x04, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m651[256] = { + 0xf0, 0x40, 0x00, 0x00, 0xc0, 0x70, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, 0x00, + 0xf0, 0x40, 0x00, 0x40, 0x70, 0xf0, 0x40, 0x40, + 0x00, 0x00, 0x40, 0xf0, 0x70, 0x00, 0x40, 0x00, + 0x00, 0x40, 0xf0, 0xf0, 0xf0, 0x00, 0x40, 0xf0, + 0x00, 0x40, 0x00, 0x00, 0x70, 0x70, 0xf0, 0xf0, + 0xf0, 0xf0, 0x40, 0xf0, 0x40, 0x40, 0xf0, 0xf0, + 0x00, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x40, + 0xf0, 0x40, 0x00, 0x00, 0x00, 0xf0, 0x80, 0xf0, + 0x40, 0xf0, 0x40, 0x00, 0x40, 0x70, 0xf0, 0xf0, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x40, + 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x40, + 0x00, 0x00, 0x00, 0x40, 0xf0, 0x80, 0x00, 0x00, + 0x70, 0x00, 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0xf0, + 0xf0, 0x00, 0x40, 0x00, 0x00, 0x40, 0x80, 0x00, + 0x00, 0x40, 0xf0, 0xf0, 0x00, 0xc0, 0x00, 0xf0, + 0x70, 0x70, 0x40, 0x00, 0xf0, 0x00, 0x70, 0x00, + 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x00, 0xf0, + 0x40, 0xf0, 0x00, 0xf0, 0xf0, 0x40, 0x00, 0xf0, + 0x40, 0xf0, 0x00, 0x40, 0xf0, 0xf0, 0x40, 0xf0, + 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x70, 0x40, 0xf0, + 0xf0, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0xf0, + 0x00, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x40, + 0x00, 0xf0, 0x40, 0x70, 0x70, 0xf0, 0x70, 0x00, + 0x40, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0xf0, + 0x40, 0x00, 0xf0, 0x00, 0x40, 0x00, 0x40, 0xf0, + 0x40, 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x40, + 0xf0, 0x70, 0x70, 0x80, 0x00, 0xf0, 0xf0, 0x70, + 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, + 0x40, 0xf0, 0x40, 0x00, 0xc0, 0x40, 0x00, 0x00, + 0x00, 0x40, 0xf0, 0xf0, 0x80, 0x80, 0x40, 0xc0, +}; + +static unsigned char m652[256] = { + 0x07, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x07, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x01, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x05, 0x05, 0x07, 0x06, + 0x07, 0x07, 0x04, 0x07, 0x04, 0x06, 0x07, 0x07, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x06, 0x04, + 0x07, 0x07, 0x06, 0x04, 0x05, 0x04, 0x04, 0x07, + 0x04, 0x07, 0x04, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x06, 0x07, 0x04, 0x01, 0x06, 0x07, 0x07, 0x04, + 0x04, 0x04, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x00, 0x06, 0x05, 0x07, 0x04, 0x04, 0x06, + 0x05, 0x04, 0x07, 0x06, 0x07, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, 0x07, + 0x04, 0x04, 0x04, 0x05, 0x07, 0x04, 0x04, 0x00, + 0x07, 0x07, 0x06, 0x01, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x07, 0x04, 0x07, 0x07, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x04, 0x07, 0x07, 0x04, 0x07, + 0x06, 0x01, 0x06, 0x07, 0x06, 0x05, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x07, 0x07, 0x04, 0x06, + 0x00, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x04, + 0x04, 0x04, 0x04, 0x07, 0x07, 0x06, 0x07, 0x07, + 0x06, 0x04, 0x07, 0x06, 0x04, 0x00, 0x07, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x05, 0x06, 0x07, 0x04, 0x04, 0x07, 0x07, 0x05, + 0x07, 0x07, 0x04, 0x04, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x05, 0x01, + 0x00, 0x04, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, +}; + +static unsigned char m661[256] = { + 0x40, 0x00, 0x70, 0x70, 0x40, 0x00, 0xf0, 0xf0, + 0x40, 0xc0, 0xf0, 0x00, 0xf0, 0x40, 0xf0, 0xf0, + 0x80, 0xc0, 0x40, 0xf0, 0xf0, 0xc0, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x40, 0xc0, 0xf0, + 0xf0, 0x40, 0x40, 0x40, 0x40, 0xf0, 0x40, 0xf0, + 0xf0, 0x40, 0x40, 0x40, 0x40, 0xf0, 0x40, 0xf0, + 0xc0, 0xc0, 0x00, 0x40, 0xf0, 0x70, 0xf0, 0x40, + 0x00, 0x40, 0x80, 0x80, 0x70, 0x00, 0x00, 0x70, + 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0x00, + 0x00, 0xf0, 0x40, 0xf0, 0x40, 0x00, 0x40, 0xf0, + 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x40, 0xc0, 0x00, 0xc0, 0x40, 0xf0, 0xf0, 0xf0, + 0x40, 0x40, 0x70, 0x00, 0xf0, 0x80, 0xf0, 0xf0, + 0xf0, 0xf0, 0x40, 0xc0, 0x40, 0x00, 0xf0, 0xf0, + 0x70, 0x00, 0x00, 0xc0, 0xf0, 0x40, 0xf0, 0xc0, + 0xc0, 0x40, 0xf0, 0x40, 0x40, 0x00, 0x40, 0x40, + 0x40, 0x70, 0x00, 0x70, 0xf0, 0x00, 0x00, 0xf0, + 0xf0, 0xf0, 0x00, 0x40, 0x40, 0x40, 0xf0, 0x00, + 0xc0, 0xf0, 0x40, 0x00, 0x00, 0x00, 0xf0, 0xf0, + 0xf0, 0x40, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x40, + 0xc0, 0x00, 0xf0, 0x00, 0x40, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, 0xf0, 0x00, + 0x00, 0x40, 0xc0, 0x80, 0xf0, 0x40, 0x00, 0x00, + 0x70, 0xf0, 0x00, 0xc0, 0x70, 0x00, 0xf0, 0x40, + 0x40, 0x70, 0x40, 0x40, 0xf0, 0x00, 0x80, 0xf0, + 0x40, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, + 0x00, 0xf0, 0x70, 0x40, 0xf0, 0xf0, 0x00, 0x40, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x40, 0x70, 0x00, 0x40, 0x40, 0x00, 0x40, 0x00, + 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0x70, 0x00, 0xf0, + 0xf0, 0xf0, 0xc0, 0x40, 0xf0, 0x70, 0xf0, 0xf0, +}; + +static unsigned char m662[256] = { + 0x07, 0x04, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, 0x04, + 0x04, 0x05, 0x04, 0x04, 0x06, 0x07, 0x04, 0x07, + 0x07, 0x06, 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, + 0x07, 0x04, 0x04, 0x06, 0x04, 0x07, 0x06, 0x07, + 0x04, 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x05, 0x00, 0x01, 0x00, + 0x04, 0x07, 0x06, 0x07, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x05, 0x07, 0x04, 0x04, 0x07, + 0x04, 0x06, 0x07, 0x01, 0x01, 0x01, 0x01, 0x05, + 0x04, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x07, 0x06, 0x04, 0x07, 0x06, 0x07, 0x04, + 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x07, + 0x07, 0x06, 0x06, 0x04, 0x07, 0x04, 0x07, 0x07, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x04, 0x07, 0x04, + 0x06, 0x04, 0x01, 0x00, 0x07, 0x04, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x04, + 0x06, 0x07, 0x04, 0x04, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x07, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x01, + 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x04, 0x06, 0x07, 0x04, + 0x06, 0x04, 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, 0x04, + 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x04, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, 0x07, 0x04, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x04, 0x07, 0x07, 0x07, 0x04, 0x06, 0x07, + 0x06, 0x07, 0x04, 0x00, 0x07, 0x00, 0x07, 0x07, +}; + +static unsigned char m671[256] = { + 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x00, 0x40, + 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x40, 0x70, + 0x00, 0x00, 0x00, 0x40, 0xf0, 0xf0, 0x70, 0xf0, + 0x00, 0x40, 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0xf0, + 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xf0, 0xf0, + 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, + 0x00, 0xf0, 0x00, 0x40, 0xf0, 0x00, 0xf0, 0x70, + 0x70, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x40, 0x70, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x40, 0xf0, 0x40, + 0x40, 0xf0, 0x00, 0x00, 0x40, 0x00, 0xf0, 0xf0, + 0xf0, 0xf0, 0x00, 0xf0, 0x40, 0x40, 0xf0, 0x00, + 0x00, 0x70, 0x00, 0x00, 0xf0, 0x40, 0xf0, 0xf0, + 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x40, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x40, 0xf0, 0x40, 0xf0, + 0xf0, 0xf0, 0x70, 0xf0, 0x40, 0xf0, 0x40, 0xf0, + 0x00, 0x00, 0x00, 0xc0, 0x70, 0x00, 0xf0, 0xf0, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x70, 0x00, 0xf0, + 0x00, 0xf0, 0x00, 0xf0, 0x70, 0x00, 0x40, 0xc0, + 0xf0, 0x40, 0x00, 0xc0, 0x00, 0xf0, 0x40, 0xf0, + 0x40, 0x40, 0xf0, 0x40, 0xf0, 0xf0, 0x00, 0x00, + 0x70, 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0xc0, 0x40, 0x40, 0xf0, 0x70, 0x40, 0xf0, 0xf0, + 0xf0, 0x70, 0x00, 0x40, 0x40, 0x40, 0x80, 0x00, + 0x40, 0x70, 0x40, 0x40, 0xf0, 0x40, 0x70, 0x00, + 0x40, 0x40, 0x70, 0x00, 0x00, 0x00, 0x70, 0xf0, + 0xf0, 0xf0, 0xc0, 0xf0, 0xf0, 0x00, 0x00, 0x40, + 0x70, 0x40, 0xf0, 0x00, 0x40, 0xf0, 0x70, 0x00, + 0x00, 0x40, 0x70, 0x00, 0x70, 0x00, 0x40, 0x70, + 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x70, 0xf0, + 0xc0, 0xf0, 0x40, 0xf0, 0xf0, 0xf0, 0xc0, 0x40, + 0x00, 0x40, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x70, +}; + +static unsigned char m672[256] = { + 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x07, 0x07, 0x07, 0x07, 0x04, 0x07, 0x04, 0x06, + 0x07, 0x04, 0x06, 0x06, 0x07, 0x07, 0x04, 0x07, + 0x06, 0x04, 0x04, 0x07, 0x04, 0x07, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x07, 0x06, + 0x07, 0x00, 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, + 0x00, 0x07, 0x04, 0x06, 0x07, 0x07, 0x04, 0x04, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x05, 0x00, 0x05, 0x01, 0x04, 0x06, 0x07, 0x06, + 0x07, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x07, 0x04, 0x06, 0x07, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, 0x07, + 0x07, 0x05, 0x04, 0x00, 0x00, 0x05, 0x04, 0x00, + 0x01, 0x01, 0x07, 0x04, 0x06, 0x07, 0x04, 0x07, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x07, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, + 0x04, 0x07, 0x04, 0x06, 0x07, 0x06, 0x06, 0x07, + 0x04, 0x07, 0x04, 0x07, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x04, 0x07, + 0x07, 0x06, 0x07, 0x04, 0x07, 0x07, 0x05, 0x06, + 0x00, 0x04, 0x05, 0x05, 0x04, 0x01, 0x04, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x04, 0x01, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, + 0x06, 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, + 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, + 0x05, 0x04, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x01, 0x04, 0x07, +}; + +static unsigned char m681[256] = { + 0x00, 0x00, 0x70, 0x70, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xf0, 0x40, 0x00, 0xf0, 0xf0, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x70, 0x40, + 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x70, 0xf0, 0x70, 0x40, 0x40, 0x00, 0xc0, + 0x40, 0x40, 0x70, 0x40, 0x70, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x40, + 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0x70, 0x00, + 0xf0, 0x00, 0x40, 0x00, 0x40, 0x70, 0xf0, 0x00, + 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0x00, 0x40, + 0x40, 0x70, 0x00, 0x40, 0x70, 0x70, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x80, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x00, 0x70, 0x40, 0xf0, 0x70, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, 0x70, 0xf0, + 0x00, 0xf0, 0x40, 0x70, 0x40, 0xf0, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0xf0, + 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0xf0, + 0x40, 0x00, 0x40, 0x70, 0x40, 0xf0, 0x00, 0xf0, + 0x70, 0xc0, 0xf0, 0x40, 0x00, 0x40, 0x70, 0xf0, + 0xf0, 0x40, 0x40, 0x00, 0x00, 0xf0, 0x40, 0xf0, + 0xf0, 0xf0, 0x40, 0xf0, 0x00, 0xf0, 0xf0, 0x00, + 0x00, 0x70, 0x70, 0x40, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xc0, 0x70, 0x00, + 0x40, 0xf0, 0x70, 0xf0, 0x40, 0xf0, 0x00, 0x40, + 0x40, 0x40, 0xf0, 0x40, 0x70, 0xf0, 0x40, 0xf0, + 0xf0, 0x40, 0xf0, 0x00, 0x40, 0x40, 0x00, 0xf0, + 0xf0, 0x70, 0x00, 0x70, 0x00, 0x40, 0x00, 0xf0, + 0xc0, 0x00, 0x40, 0x40, 0x40, 0x40, 0xf0, 0x70, + 0x40, 0x40, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0xf0, 0xf0, 0x40, 0x40, 0x40, 0x00, 0x00, +}; + +static unsigned char m682[256] = { + 0x05, 0x04, 0x00, 0x00, 0x04, 0x05, 0x04, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x04, 0x05, 0x06, 0x07, 0x06, 0x04, 0x07, 0x07, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x07, 0x04, 0x06, + 0x06, 0x07, 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x07, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x05, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x07, 0x05, 0x04, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, + 0x07, 0x07, 0x05, 0x06, 0x07, 0x06, 0x07, 0x06, + 0x07, 0x07, 0x04, 0x07, 0x07, 0x05, 0x04, 0x04, + 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x07, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x07, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x07, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x04, 0x05, 0x07, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, + 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, 0x04, 0x04, + 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x01, 0x04, 0x01, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x07, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x07, 0x04, 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x04, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x07, 0x06, 0x04, 0x04, +}; + +static unsigned char m691[256] = { + 0xf0, 0x70, 0x00, 0x00, 0x70, 0xf0, 0x40, 0x00, + 0x70, 0x40, 0x40, 0x70, 0x70, 0xf0, 0xf0, 0x70, + 0x40, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x70, 0x70, 0x70, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x70, 0x70, 0x00, 0x70, 0x70, 0x80, + 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x40, 0x00, 0x40, 0x70, 0x40, 0x70, 0x00, + 0x40, 0x70, 0x00, 0x40, 0x00, 0xf0, 0x00, 0xf0, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0x00, 0xc0, + 0x00, 0xf0, 0xf0, 0x40, 0x70, 0x70, 0xf0, 0x00, + 0xf0, 0xf0, 0xf0, 0xc0, 0x40, 0x40, 0x40, 0x00, + 0xc0, 0x40, 0x70, 0xf0, 0x40, 0xf0, 0xf0, 0xf0, + 0x40, 0x40, 0x40, 0x70, 0x70, 0xf0, 0x00, 0xf0, + 0xf0, 0xf0, 0x40, 0x40, 0x70, 0x70, 0x70, 0x40, + 0x40, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, 0x70, 0x00, + 0x00, 0x70, 0x40, 0x00, 0x70, 0xf0, 0x40, 0x00, + 0x40, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, + 0x70, 0x40, 0x00, 0x00, 0x00, 0xc0, 0x40, 0xf0, + 0x40, 0x00, 0x00, 0x40, 0x00, 0x40, 0xf0, 0x40, + 0x00, 0x70, 0x70, 0x00, 0xf0, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x40, 0xf0, 0x40, 0x00, 0x70, 0x70, + 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x00, 0x70, + 0x40, 0x00, 0x70, 0xf0, 0xf0, 0xf0, 0x70, 0x00, + 0xf0, 0x40, 0x00, 0x70, 0x00, 0x00, 0x40, 0x40, + 0x70, 0x70, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x70, + 0xf0, 0x00, 0x80, 0x70, 0x00, 0x70, 0x40, 0x40, + 0x00, 0x40, 0x70, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x70, 0x00, 0xf0, 0x00, 0xf0, 0x40, 0xf0, +}; + +static unsigned char m692[256] = { + 0x04, 0x05, 0x04, 0x04, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, 0x07, 0x06, + 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x04, + 0x00, 0x04, 0x06, 0x04, 0x04, 0x01, 0x04, 0x06, + 0x07, 0x04, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x07, 0x04, 0x07, + 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x07, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x07, 0x04, 0x06, 0x07, 0x04, 0x06, 0x07, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x05, 0x04, 0x00, 0x04, + 0x05, 0x00, 0x07, 0x06, 0x01, 0x04, 0x07, 0x01, + 0x01, 0x01, 0x04, 0x00, 0x04, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x05, 0x06, 0x06, 0x07, 0x07, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x06, 0x07, + 0x04, 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, + 0x07, 0x04, 0x04, 0x06, 0x07, 0x04, 0x04, 0x04, + 0x04, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x04, 0x06, 0x07, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x07, 0x06, 0x07, +}; + +static unsigned char m6a1[256] = { + 0x40, 0x40, 0xf0, 0x40, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x70, 0x70, 0x00, 0x00, 0x40, + 0x00, 0xc0, 0x70, 0xf0, 0x70, 0x40, 0x00, 0xf0, + 0x00, 0xf0, 0x40, 0x70, 0x00, 0x40, 0xf0, 0xf0, + 0x40, 0xf0, 0x70, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x70, 0x70, 0x70, 0x00, 0x00, 0x70, 0x00, + 0x40, 0x00, 0x40, 0x00, 0x40, 0xf0, 0x70, 0x40, + 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0xf0, 0x40, 0x40, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x70, + 0xf0, 0x40, 0x40, 0xf0, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x40, 0xc0, 0x80, 0x00, 0x40, 0x40, 0x00, + 0xf0, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x00, 0xf0, + 0x00, 0xf0, 0x70, 0x00, 0x40, 0x00, 0x70, 0x40, + 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, + 0xf0, 0x40, 0x00, 0x40, 0xf0, 0x00, 0x40, 0x40, + 0x00, 0xc0, 0x00, 0x40, 0x00, 0xf0, 0xf0, 0x00, + 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0x00, 0x40, 0xf0, 0x40, 0x40, 0x40, + 0x70, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x40, 0x70, 0x00, 0x70, 0x40, + 0x40, 0x40, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x40, + 0x00, 0x70, 0xf0, 0xf0, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x70, 0x00, 0xf0, 0x40, 0x40, 0x40, 0x00, + 0x00, 0x00, 0xf0, 0xf0, 0x40, 0x40, 0x70, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, + 0x70, 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x70, 0xf0, 0x40, 0x40, 0x00, 0x00, +}; + +static unsigned char m6a2[256] = { + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x04, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x04, 0x05, 0x04, 0x04, 0x04, 0x00, 0x01, + 0x00, 0x01, 0x06, 0x04, 0x06, 0x07, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x07, 0x04, 0x06, 0x07, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x07, 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x05, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x06, 0x04, + 0x04, 0x01, 0x04, 0x00, 0x01, 0x04, 0x06, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x07, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, 0x07, 0x04, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x01, 0x04, 0x05, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x00, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x00, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x04, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, +}; + +static unsigned char m6b1[256] = { + 0x00, 0x00, 0x40, 0x40, 0xf0, 0x70, 0x40, 0x40, + 0x00, 0x40, 0xf0, 0x00, 0x80, 0x00, 0x00, 0x40, + 0x40, 0x40, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x70, 0x40, 0x70, + 0xf0, 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x70, + 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x70, + 0x70, 0x70, 0xf0, 0x40, 0x00, 0xf0, 0xf0, 0x40, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xc0, 0xf0, + 0x00, 0x70, 0x40, 0x00, 0xf0, 0x40, 0xf0, 0x00, + 0xf0, 0x00, 0x40, 0x70, 0x70, 0x00, 0x40, 0x00, + 0x40, 0x70, 0x00, 0x70, 0x00, 0x40, 0x00, 0xf0, + 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0x80, 0xf0, 0x40, + 0x00, 0x70, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x70, + 0x40, 0x00, 0x80, 0x70, 0x70, 0x40, 0x00, 0x80, + 0xf0, 0x70, 0x00, 0xf0, 0x00, 0x40, 0x40, 0xf0, + 0x70, 0x00, 0x40, 0xf0, 0xf0, 0x40, 0xf0, 0x00, + 0x00, 0xf0, 0xf0, 0x70, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x40, + 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, 0xf0, 0x40, + 0x40, 0x00, 0x40, 0x40, 0x70, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x70, 0x70, 0x40, 0x40, 0xc0, 0xf0, + 0x40, 0x70, 0xf0, 0x70, 0x70, 0xf0, 0x00, 0xf0, + 0x40, 0x40, 0xf0, 0x70, 0xf0, 0x40, 0x40, 0xf0, + 0x70, 0x80, 0x00, 0x40, 0x40, 0xf0, 0xf0, 0x00, + 0x00, 0x40, 0x00, 0xf0, 0x40, 0xf0, 0x70, 0x80, + 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0x00, 0xc0, 0x80, + 0xf0, 0x00, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x70, + 0x00, 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, +}; + +static unsigned char m6b2[256] = { + 0x06, 0x04, 0x06, 0x06, 0x06, 0x00, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x00, + 0x07, 0x07, 0x05, 0x07, 0x05, 0x06, 0x04, 0x05, + 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x06, 0x04, 0x06, 0x07, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x04, 0x06, 0x06, 0x07, 0x04, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x07, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x04, 0x04, 0x07, 0x04, 0x04, 0x06, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x07, 0x01, 0x04, 0x06, 0x06, + 0x06, 0x05, 0x07, 0x07, 0x07, 0x04, 0x07, 0x01, + 0x06, 0x07, 0x07, 0x05, 0x06, 0x07, 0x06, 0x06, + 0x04, 0x06, 0x01, 0x01, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x01, 0x07, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x00, 0x06, 0x07, 0x05, 0x07, 0x06, 0x07, + 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x07, + 0x06, 0x05, 0x01, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, + 0x06, 0x04, 0x07, 0x07, 0x07, 0x01, 0x07, 0x07, + 0x06, 0x01, 0x06, 0x07, 0x04, 0x04, 0x06, 0x00, + 0x06, 0x05, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x05, 0x07, 0x06, 0x04, 0x00, 0x07, + 0x06, 0x04, 0x06, 0x07, 0x04, 0x05, 0x04, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, +}; + +static unsigned char m6c1[256] = { + 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x00, 0x00, + 0xf0, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0xf0, + 0x40, 0xf0, 0x40, 0xf0, 0x70, 0x00, 0x00, 0x70, + 0x00, 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0xf0, 0x70, 0x00, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x40, 0xf0, 0x40, 0x40, 0xf0, + 0xf0, 0x00, 0x40, 0x40, 0x00, 0x00, 0xf0, 0x40, + 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, 0xf0, 0x40, + 0xf0, 0x00, 0x40, 0x00, 0x40, 0xf0, 0x00, 0xf0, + 0x00, 0x40, 0xf0, 0x40, 0x40, 0xf0, 0xf0, 0xf0, + 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, + 0xf0, 0x00, 0xf0, 0x40, 0x00, 0xc0, 0x00, 0x40, + 0xf0, 0x00, 0xf0, 0x70, 0x40, 0x00, 0xc0, 0x00, + 0x40, 0x40, 0xf0, 0x40, 0x00, 0xf0, 0xf0, 0x00, + 0x00, 0xf0, 0xf0, 0xf0, 0x00, 0xc0, 0xc0, 0xc0, + 0xf0, 0x40, 0x00, 0x00, 0xf0, 0x70, 0x00, 0x00, + 0xf0, 0x00, 0xf0, 0xf0, 0xc0, 0xc0, 0xf0, 0x40, + 0x40, 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, + 0x40, 0x70, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0x70, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0x00, 0xf0, 0xc0, 0x00, 0xf0, 0x70, 0x40, 0x00, + 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x40, + 0x40, 0x40, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf0, + 0x00, 0x70, 0x40, 0xf0, 0x40, 0x70, 0x00, 0x00, + 0x40, 0xf0, 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0x40, + 0xf0, 0x40, 0x70, 0xc0, 0x40, 0x00, 0xc0, 0xf0, + 0xf0, 0x70, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m6c2[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x01, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x07, 0x00, 0x07, + 0x07, 0x07, 0x04, 0x07, 0x07, 0x07, 0x07, 0x00, + 0x07, 0x07, 0x07, 0x07, 0x04, 0x06, 0x04, 0x07, + 0x06, 0x07, 0x01, 0x06, 0x07, 0x06, 0x07, 0x07, + 0x07, 0x01, 0x07, 0x06, 0x06, 0x04, 0x07, 0x07, + 0x07, 0x04, 0x05, 0x06, 0x07, 0x01, 0x06, 0x04, + 0x07, 0x04, 0x00, 0x06, 0x04, 0x01, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x04, 0x04, 0x07, 0x01, + 0x00, 0x05, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x04, 0x06, 0x04, 0x07, 0x07, 0x04, 0x07, + 0x04, 0x06, 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x04, 0x01, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, + 0x06, 0x05, 0x06, 0x06, 0x04, 0x07, 0x07, 0x04, + 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, + 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x04, 0x05, + 0x04, 0x05, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x05, 0x07, 0x06, 0x07, 0x07, 0x04, + 0x06, 0x07, 0x05, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x04, 0x07, 0x07, 0x04, 0x07, 0x06, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x04, + 0x07, 0x07, 0x07, 0x07, 0x04, 0x07, 0x04, 0x06, + 0x07, 0x06, 0x05, 0x07, 0x06, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x04, 0x07, 0x01, 0x01, + 0x01, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, +}; + +static unsigned char m6d1[256] = { + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x40, 0x40, + 0x00, 0xc0, 0x70, 0x40, 0x00, 0x00, 0x00, 0xf0, + 0x00, 0xf0, 0x40, 0xf0, 0x00, 0x00, 0xf0, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0xc0, + 0x40, 0xf0, 0xf0, 0x70, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x40, 0xf0, 0x70, 0x00, 0xf0, 0xf0, 0x00, + 0xf0, 0xc0, 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0x40, + 0x00, 0xf0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x00, 0xf0, 0x70, 0x40, 0xf0, 0x40, + 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x40, + 0x40, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, + 0xf0, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x40, 0x00, 0x00, 0xf0, 0x00, 0xc0, + 0xf0, 0x80, 0x00, 0x00, 0xf0, 0x80, 0xf0, 0x00, + 0x00, 0xc0, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0x40, + 0x40, 0x70, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0xf0, 0x00, 0x40, + 0x70, 0x40, 0x00, 0x00, 0x70, 0x40, 0x00, 0x40, + 0xf0, 0x00, 0x00, 0x80, 0xc0, 0xf0, 0xf0, 0xf0, + 0x40, 0x00, 0x40, 0xf0, 0x70, 0x00, 0x40, 0xc0, + 0x00, 0xf0, 0x70, 0x00, 0x00, 0x70, 0x40, 0x00, + 0xf0, 0xf0, 0x80, 0x40, 0x00, 0x40, 0xf0, 0x40, + 0x40, 0xf0, 0x40, 0x00, 0x70, 0x40, 0x70, 0x00, + 0xf0, 0x40, 0xf0, 0xf0, 0x70, 0x00, 0xf0, 0x40, + 0x40, 0xf0, 0x00, 0xf0, 0x40, 0xf0, 0x40, 0xf0, + 0x80, 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x00, +}; + +static unsigned char m6d2[256] = { + 0x06, 0x07, 0x04, 0x06, 0x07, 0x04, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x07, 0x04, 0x04, 0x04, 0x06, 0x07, + 0x06, 0x07, 0x07, 0x07, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x04, 0x07, 0x04, 0x07, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x07, 0x06, 0x05, 0x04, 0x05, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x04, 0x04, + 0x06, 0x07, 0x07, 0x04, 0x05, 0x04, 0x07, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x07, 0x04, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x04, 0x04, 0x04, 0x07, 0x06, 0x06, 0x07, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, 0x04, + 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x04, 0x06, + 0x06, 0x04, 0x04, 0x05, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x04, 0x01, 0x01, + 0x01, 0x01, 0x07, 0x07, 0x06, 0x04, 0x07, 0x07, + 0x04, 0x04, 0x07, 0x06, 0x06, 0x07, 0x04, 0x06, + 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x04, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x07, 0x06, 0x07, 0x07, 0x06, 0x04, 0x04, +}; + +static unsigned char m6e1[256] = { + 0x40, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x70, + 0x70, 0x70, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x00, 0x80, + 0x00, 0xf0, 0xf0, 0xf0, 0x00, 0x70, 0x40, 0xf0, + 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, + 0x00, 0x70, 0x00, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, + 0x00, 0x00, 0xc0, 0x00, 0x80, 0x00, 0xc0, 0x00, + 0xf0, 0x40, 0xf0, 0x40, 0xc0, 0x80, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xc0, 0x40, 0x00, 0x00, + 0x40, 0x40, 0xf0, 0x40, 0x00, 0xf0, 0x70, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, 0xf0, 0x40, + 0xf0, 0x00, 0x00, 0xf0, 0xc0, 0x40, 0xc0, 0xf0, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0xf0, + 0x40, 0x00, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0xf0, + 0x00, 0x00, 0xf0, 0xc0, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x80, 0x40, 0x00, 0x40, 0x70, 0x70, + 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x40, 0x00, 0x70, + 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, 0xf0, 0x00, + 0x70, 0x40, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0xf0, + 0x40, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x40, + 0x00, 0x00, 0xf0, 0x80, 0x00, 0x40, 0x40, 0xf0, + 0x00, 0xc0, 0x70, 0x40, 0x00, 0x00, 0xf0, 0x70, + 0x00, 0x00, 0xf0, 0x40, 0x00, 0x70, 0x00, 0x40, + 0x40, 0x40, 0xf0, 0x40, 0xf0, 0xf0, 0x00, 0x40, + 0x40, 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0xc0, 0x40, + 0x00, 0xf0, 0x00, 0xf0, 0xf0, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x70, 0x40, 0x40, 0xf0, + 0x00, 0x00, 0x70, 0x00, 0xf0, 0x00, 0x00, 0x70, + 0xf0, 0x40, 0x00, 0x40, 0x00, 0x40, 0xf0, 0xf0, +}; + +static unsigned char m6e2[256] = { + 0x06, 0x04, 0x04, 0x06, 0x04, 0x07, 0x04, 0x04, + 0x04, 0x04, 0x05, 0x04, 0x05, 0x01, 0x01, 0x04, + 0x01, 0x01, 0x04, 0x00, 0x01, 0x04, 0x01, 0x05, + 0x04, 0x06, 0x07, 0x06, 0x06, 0x07, 0x04, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x05, 0x04, 0x07, 0x06, 0x07, 0x06, 0x07, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x04, + 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x07, 0x07, 0x04, + 0x04, 0x06, 0x06, 0x07, 0x07, 0x06, 0x07, 0x04, + 0x07, 0x04, 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x07, 0x04, 0x04, 0x07, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x05, 0x01, + 0x04, 0x00, 0x04, 0x01, 0x04, 0x01, 0x05, 0x00, + 0x06, 0x07, 0x04, 0x04, 0x00, 0x06, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x07, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, + 0x04, 0x04, 0x07, 0x06, 0x04, 0x04, 0x06, 0x07, + 0x06, 0x07, 0x07, 0x06, 0x07, 0x04, 0x07, 0x07, + 0x04, 0x06, 0x07, 0x05, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x05, + 0x06, 0x04, 0x05, 0x04, 0x06, 0x04, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x04, 0x01, 0x01, 0x05, 0x00, + 0x05, 0x05, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m6f1[256] = { + 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x00, 0xf0, 0x00, + 0x40, 0x70, 0x40, 0x00, 0x40, 0x40, 0x00, 0xf0, + 0x00, 0xf0, 0x00, 0x70, 0xf0, 0xf0, 0x40, 0x00, + 0x40, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x00, 0x40, + 0x40, 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x00, + 0xf0, 0x00, 0x00, 0x40, 0x40, 0x00, 0x70, 0xf0, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0xc0, 0x40, 0x40, 0xf0, 0x00, 0x00, 0xc0, + 0xf0, 0x40, 0xc0, 0xf0, 0x70, 0x40, 0xc0, 0xf0, + 0x00, 0x40, 0xc0, 0x00, 0xf0, 0x00, 0x70, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x40, 0xf0, 0xf0, 0x70, + 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x00, 0xf0, 0x00, 0xf0, 0xc0, 0xc0, 0x00, + 0x70, 0xf0, 0x70, 0x40, 0xf0, 0x00, 0x70, 0x40, + 0xc0, 0x00, 0x00, 0x40, 0x40, 0xc0, 0xf0, 0x00, + 0xc0, 0x70, 0x40, 0x40, 0xc0, 0x00, 0x40, 0xf0, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x70, 0x00, 0xf0, 0xf0, 0x40, 0x40, 0xc0, + 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, 0xc0, 0xc0, + 0x40, 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x80, 0x00, + 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x40, 0x70, 0x40, + 0x40, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x00, 0x00, + 0x70, 0x00, 0xc0, 0x70, 0x00, 0x00, 0x40, 0xf0, + 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x40, 0xc0, 0x00, 0xf0, 0xf0, 0x00, 0x70, 0xf0, + 0x40, 0xf0, 0x00, 0x70, 0x00, 0x40, 0x70, 0x00, + 0x00, 0x40, 0x70, 0x00, 0x40, 0x40, 0xf0, 0x00, +}; + +static unsigned char m6f2[256] = { + 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x06, 0x04, 0x04, 0x06, 0x06, 0x07, + 0x04, 0x04, 0x06, 0x07, 0x07, 0x07, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x07, 0x07, 0x06, 0x07, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x05, 0x01, + 0x04, 0x04, 0x04, 0x01, 0x04, 0x01, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x07, 0x04, 0x06, 0x06, 0x05, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x04, 0x07, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x05, 0x04, 0x06, 0x06, + 0x07, 0x04, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x04, 0x06, 0x07, 0x07, 0x07, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x04, 0x00, 0x01, 0x04, 0x06, 0x04, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x07, 0x04, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x07, 0x06, 0x07, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x01, 0x01, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x00, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, +}; + +static unsigned char m701[256] = { + 0x40, 0xf0, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x40, + 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x00, 0xf0, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, + 0xf0, 0x00, 0xf0, 0xf0, 0x80, 0xf0, 0xf0, 0xf0, + 0x40, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x70, 0xf0, + 0x80, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xc0, + 0x70, 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, 0xc0, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x40, 0x00, + 0x80, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x40, 0x00, 0x40, 0x70, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x40, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x00, + 0x00, 0x70, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x40, 0x40, + 0xc0, 0xf0, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf0, 0x70, 0xf0, + 0x40, 0x40, 0x00, 0xf0, 0x40, 0x00, 0x00, 0xc0, + 0xf0, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x40, 0xf0, 0x00, 0x00, 0x00, 0xf0, + 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, + 0xc0, 0xf0, 0x00, 0x00, 0x40, 0xf0, 0x00, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0x00, 0xf0, 0x00, 0x00, +}; + +static unsigned char m702[256] = { + 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x04, 0x00, 0x01, + 0x00, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x05, 0x01, 0x04, 0x05, + 0x07, 0x06, 0x04, 0x04, 0x06, 0x05, 0x07, 0x04, + 0x07, 0x04, 0x06, 0x04, 0x07, 0x06, 0x05, 0x05, + 0x01, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x04, 0x05, 0x07, 0x04, 0x04, 0x04, 0x07, 0x04, + 0x04, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x04, + 0x06, 0x07, 0x06, 0x04, 0x01, 0x01, 0x00, 0x06, + 0x04, 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, 0x04, + 0x04, 0x06, 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x07, 0x04, 0x07, 0x06, 0x06, 0x04, 0x07, + 0x07, 0x05, 0x06, 0x05, 0x01, 0x01, 0x06, 0x04, + 0x05, 0x01, 0x01, 0x01, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x04, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x07, 0x07, 0x06, 0x05, 0x06, 0x06, 0x06, 0x05, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x04, 0x01, 0x01, + 0x01, 0x01, 0x04, 0x01, 0x01, 0x01, 0x04, 0x07, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, +}; + +static unsigned char m711[256] = { + 0x00, 0x00, 0x00, 0x40, 0xc0, 0x40, 0x40, 0x40, + 0x00, 0xf0, 0x00, 0x40, 0xc0, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0x00, 0x70, 0x00, 0xc0, 0x00, + 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, + 0xc0, 0x40, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0xc0, + 0x00, 0xf0, 0xc0, 0x40, 0xf0, 0x00, 0xf0, 0x00, + 0xc0, 0x00, 0x40, 0x00, 0x00, 0x70, 0xf0, 0x40, + 0x00, 0xf0, 0x40, 0x00, 0xc0, 0x00, 0xc0, 0x00, + 0x40, 0x00, 0x70, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, + 0x40, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x00, 0x40, + 0x70, 0x80, 0xf0, 0x00, 0x40, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0xc0, 0x00, 0xf0, 0x70, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x00, 0xf0, + 0x40, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, + 0x40, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x40, 0xc0, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0x00, 0x40, 0x40, 0x00, 0xf0, 0x00, + 0xf0, 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0x70, + 0x00, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, 0xf0, + 0x70, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x40, 0x70, 0x00, 0xf0, 0xf0, 0x00, 0xc0, 0xf0, +}; + +static unsigned char m712[256] = { + 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x04, 0x04, 0x07, 0x00, 0x01, 0x01, 0x06, + 0x01, 0x07, 0x07, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, 0x04, + 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x07, + 0x07, 0x07, 0x06, 0x04, 0x04, 0x04, 0x07, 0x04, + 0x04, 0x04, 0x06, 0x04, 0x00, 0x04, 0x00, 0x04, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, + 0x04, 0x06, 0x05, 0x06, 0x07, 0x06, 0x07, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, + 0x07, 0x06, 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, + 0x06, 0x04, 0x07, 0x01, 0x04, 0x04, 0x04, 0x04, + 0x07, 0x04, 0x05, 0x06, 0x04, 0x07, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x07, 0x04, 0x04, 0x04, 0x04, 0x07, + 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x04, 0x06, + 0x05, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x04, 0x07, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x07, 0x04, 0x04, + 0x06, 0x07, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x07, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, + 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x07, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x00, 0x00, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m721[256] = { + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x70, 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0x00, 0x40, + 0xf0, 0x00, 0xf0, 0x00, 0x40, 0xf0, 0xf0, 0x00, + 0x40, 0x40, 0xf0, 0xf0, 0x70, 0xf0, 0xf0, 0x70, + 0xf0, 0x40, 0x40, 0x40, 0x00, 0x40, 0xf0, 0xf0, + 0xf0, 0x00, 0x00, 0x70, 0xf0, 0x00, 0x40, 0x40, + 0x40, 0x00, 0xf0, 0x40, 0x00, 0x40, 0x40, 0x00, + 0xf0, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf0, + 0x40, 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x00, 0xf0, + 0x40, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x40, 0xf0, 0x00, 0x70, 0x00, 0x00, 0x40, + 0x40, 0xf0, 0x00, 0x40, 0x40, 0xf0, 0x70, 0x40, + 0xf0, 0xf0, 0x70, 0x00, 0x40, 0x00, 0x00, 0x70, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x70, 0x40, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x40, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, 0xf0, + 0x00, 0x40, 0x70, 0x00, 0x40, 0x00, 0x70, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x80, 0x40, 0xf0, 0x70, 0xf0, 0x00, 0x70, 0x40, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, + 0xf0, 0x00, 0x70, 0x00, 0x00, 0x40, 0x40, 0xf0, + 0x40, 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x40, + 0x70, 0xf0, 0x70, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x70, + 0xf0, 0xf0, 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x00, +}; + +static unsigned char m722[256] = { + 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x04, 0x07, 0x06, 0x04, 0x04, + 0x07, 0x01, 0x04, 0x00, 0x04, 0x07, 0x07, 0x01, + 0x07, 0x07, 0x06, 0x07, 0x04, 0x07, 0x06, 0x07, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x07, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x01, 0x04, 0x06, + 0x04, 0x04, 0x07, 0x06, 0x04, 0x04, 0x07, 0x04, + 0x06, 0x07, 0x06, 0x07, 0x00, 0x07, 0x06, 0x07, + 0x06, 0x07, 0x07, 0x06, 0x04, 0x04, 0x05, 0x07, + 0x04, 0x07, 0x06, 0x04, 0x06, 0x04, 0x07, 0x07, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x01, 0x06, 0x06, + 0x06, 0x07, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x04, 0x07, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x01, 0x07, 0x06, 0x07, 0x06, 0x05, + 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x05, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x05, 0x06, 0x07, + 0x07, 0x04, 0x04, 0x04, 0x07, 0x06, 0x05, 0x01, + 0x01, 0x05, 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x04, + 0x01, 0x06, 0x06, 0x06, 0x06, 0x05, 0x07, 0x04, + 0x07, 0x06, 0x07, 0x04, 0x06, 0x04, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x04, 0x01, 0x06, + 0x07, 0x07, 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x07, 0x07, 0x06, 0x06, 0x05, 0x05, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x07, 0x07, 0x04, 0x06, 0x07, + 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, +}; + +static unsigned char m731[256] = { + 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x00, 0x00, 0xf0, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0xf0, 0x70, + 0x40, 0x40, 0x00, 0xf0, 0xf0, 0xf0, 0x40, 0x70, + 0x00, 0x00, 0x40, 0x00, 0x40, 0xf0, 0x00, 0x40, + 0x40, 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0x70, 0x70, + 0x00, 0x40, 0x40, 0x00, 0x70, 0x40, 0xf0, 0xf0, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, 0xf0, 0xf0, + 0x00, 0x00, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, 0x70, + 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x40, 0xf0, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, 0x40, + 0xf0, 0x40, 0xf0, 0x40, 0x40, 0x00, 0x40, 0x40, + 0xf0, 0x40, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x40, + 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x00, 0x40, 0xf0, 0x40, 0xc0, 0xf0, + 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xc0, 0x00, + 0x40, 0x00, 0x00, 0x40, 0x80, 0x40, 0xf0, 0xc0, + 0xc0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0xc0, + 0x40, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x80, + 0x00, 0xf0, 0x40, 0x40, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x00, 0x40, + 0x00, 0xc0, 0x00, 0x70, 0x40, 0x40, 0x00, 0x40, + 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x70, 0xc0, 0xf0, 0x40, 0xc0, 0xf0, 0x70, 0xc0, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0x00, + 0xf0, 0x40, 0x00, 0xc0, 0x80, 0xf0, 0xc0, 0x40, + 0x00, 0xc0, 0xf0, 0x00, 0x00, 0xf0, 0x70, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x40, 0x40, 0x00, 0xc0, + 0x70, 0xc0, 0x40, 0x40, 0x00, 0xc0, 0xf0, 0x40, +}; + +static unsigned char m732[256] = { + 0x06, 0x07, 0x04, 0x01, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x04, 0x05, 0x06, + 0x04, 0x06, 0x06, 0x07, 0x04, 0x05, 0x07, 0x07, + 0x06, 0x06, 0x04, 0x07, 0x07, 0x07, 0x07, 0x00, + 0x00, 0x01, 0x07, 0x06, 0x04, 0x07, 0x06, 0x06, + 0x04, 0x07, 0x05, 0x05, 0x05, 0x06, 0x05, 0x04, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, + 0x05, 0x01, 0x06, 0x06, 0x06, 0x04, 0x07, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x07, 0x06, 0x04, + 0x07, 0x06, 0x07, 0x04, 0x04, 0x04, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x01, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x07, 0x04, 0x04, 0x07, 0x04, + 0x04, 0x05, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x04, 0x00, 0x00, 0x01, 0x04, 0x06, 0x04, 0x07, + 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x07, 0x04, 0x07, 0x06, 0x06, 0x01, 0x05, + 0x01, 0x00, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x05, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x07, 0x04, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x05, 0x07, 0x06, 0x06, 0x07, 0x04, 0x05, + 0x05, 0x01, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x04, + 0x07, 0x04, 0x04, 0x06, 0x04, 0x07, 0x04, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x04, 0x07, 0x06, 0x04, + 0x00, 0x00, 0x01, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m741[256] = { + 0x40, 0xc0, 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0xc0, + 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0xf0, 0x00, 0x40, 0xf0, 0xc0, 0x00, + 0xc0, 0x40, 0xc0, 0xc0, 0xc0, 0x40, 0xc0, 0xc0, + 0xc0, 0x40, 0x70, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, + 0x80, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0xc0, 0xf0, 0x00, 0xc0, 0xc0, 0x00, 0x40, 0x40, + 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x40, 0x00, 0x00, 0xf0, 0x00, 0xc0, + 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0xf0, 0xf0, + 0xf0, 0x00, 0xc0, 0x70, 0xf0, 0x80, 0x40, 0x40, + 0xc0, 0xf0, 0xf0, 0x40, 0x00, 0x40, 0x40, 0xf0, + 0x70, 0x40, 0x40, 0x70, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x40, 0x40, 0x80, 0xf0, 0x00, 0x40, 0x40, 0xc0, + 0x00, 0xc0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x40, 0x40, 0x00, 0xc0, 0x00, 0xf0, 0xc0, + 0x40, 0xc0, 0x70, 0xc0, 0x00, 0x80, 0x40, 0xf0, + 0xc0, 0x40, 0xc0, 0x40, 0x00, 0x00, 0x40, 0x40, + 0xf0, 0x40, 0xc0, 0x00, 0x00, 0xc0, 0x00, 0x00, + 0x00, 0xc0, 0x00, 0x40, 0x00, 0xf0, 0x00, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x40, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x00, 0xf0, + 0x40, 0x00, 0x00, 0x40, 0xf0, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0xc0, 0x40, 0xf0, 0x00, 0x40, 0x40, + 0xf0, 0x00, 0xf0, 0xf0, 0x40, 0x00, 0xf0, 0x70, + 0x40, 0x70, 0x40, 0x40, 0x00, 0x00, 0xf0, 0x40, + 0x70, 0x70, 0x70, 0x00, 0x40, 0x00, 0x70, 0xf0, + 0x70, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, +}; + +static unsigned char m742[256] = { + 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, 0x07, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x00, 0x01, + 0x01, 0x00, 0x04, 0x04, 0x04, 0x04, 0x06, 0x04, + 0x04, 0x04, 0x07, 0x07, 0x04, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, 0x04, + 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x00, + 0x04, 0x04, 0x06, 0x04, 0x05, 0x04, 0x04, 0x06, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, 0x04, 0x07, + 0x04, 0x07, 0x07, 0x07, 0x07, 0x04, 0x07, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x04, 0x07, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, 0x05, 0x01, + 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, 0x07, 0x06, + 0x07, 0x07, 0x04, 0x07, 0x04, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x04, 0x01, 0x04, + 0x07, 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, + 0x04, 0x04, 0x01, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, + 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x00, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x07, 0x05, + 0x00, 0x00, 0x00, 0x04, 0x07, 0x06, 0x07, 0x07, + 0x04, 0x04, 0x04, 0x06, 0x00, 0x06, 0x06, 0x07, +}; + +static unsigned char m751[256] = { + 0x00, 0x80, 0x00, 0x70, 0xf0, 0x70, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x70, 0x00, + 0x00, 0xf0, 0x40, 0x70, 0x00, 0xf0, 0x40, 0x40, + 0xf0, 0x00, 0xf0, 0x80, 0x70, 0x00, 0x70, 0xf0, + 0x40, 0x40, 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0x40, + 0xf0, 0x40, 0x40, 0xf0, 0xf0, 0x00, 0x00, 0x40, + 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x40, 0xf0, + 0xf0, 0x40, 0xf0, 0x70, 0x70, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x40, 0x70, 0x00, 0x70, 0xc0, + 0x40, 0x70, 0x70, 0x70, 0xf0, 0x70, 0x40, 0xf0, + 0x40, 0xf0, 0x40, 0x80, 0xf0, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0x70, 0xf0, 0xf0, 0xf0, 0x40, 0x40, + 0x70, 0x40, 0xf0, 0x00, 0x70, 0xf0, 0xf0, 0x70, + 0x00, 0x70, 0xf0, 0x70, 0x00, 0x70, 0x00, 0xc0, + 0xf0, 0x40, 0x00, 0x70, 0x70, 0x80, 0xf0, 0x70, + 0xf0, 0x40, 0xc0, 0x40, 0x40, 0x40, 0x40, 0xf0, + 0x00, 0x40, 0x70, 0x00, 0x00, 0x40, 0xf0, 0xf0, + 0x00, 0x70, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, + 0x40, 0xf0, 0x40, 0x40, 0x70, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x70, 0x00, 0x40, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x70, 0x40, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0xf0, 0x40, 0xf0, 0x00, 0x00, + 0xf0, 0xf0, 0x40, 0x00, 0xf0, 0xf0, 0xf0, 0x40, + 0x40, 0x40, 0xf0, 0x70, 0x40, 0xf0, 0x40, 0xf0, + 0x00, 0x00, 0x70, 0x00, 0x40, 0xf0, 0x40, 0x40, + 0x00, 0x00, 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0x40, + 0xf0, 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x70, 0x40, + 0x40, 0x40, 0xf0, 0x70, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x70, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, + 0xf0, 0x40, 0xf0, 0x70, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x40, 0xf0, 0x00, 0xf0, 0x00, 0x70, 0x70, +}; + +static unsigned char m752[256] = { + 0x06, 0x04, 0x06, 0x06, 0x07, 0x00, 0x04, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x07, 0x04, 0x07, + 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x01, 0x07, 0x04, 0x07, 0x06, 0x04, 0x07, + 0x04, 0x06, 0x06, 0x04, 0x04, 0x07, 0x06, 0x04, + 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x00, 0x01, 0x04, 0x07, + 0x07, 0x06, 0x07, 0x05, 0x00, 0x06, 0x07, 0x06, + 0x07, 0x04, 0x04, 0x04, 0x04, 0x01, 0x04, 0x06, + 0x07, 0x04, 0x04, 0x07, 0x07, 0x04, 0x07, 0x07, + 0x04, 0x04, 0x00, 0x04, 0x07, 0x04, 0x04, 0x04, + 0x04, 0x07, 0x07, 0x07, 0x07, 0x06, 0x04, 0x06, + 0x00, 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, + 0x04, 0x00, 0x07, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x05, 0x00, 0x01, 0x04, 0x06, 0x06, + 0x07, 0x07, 0x04, 0x04, 0x04, 0x06, 0x06, 0x07, + 0x06, 0x04, 0x00, 0x05, 0x06, 0x04, 0x07, 0x06, + 0x04, 0x04, 0x06, 0x07, 0x06, 0x00, 0x04, 0x07, + 0x06, 0x07, 0x05, 0x04, 0x07, 0x06, 0x01, 0x01, + 0x06, 0x07, 0x07, 0x04, 0x04, 0x07, 0x04, 0x01, + 0x01, 0x01, 0x06, 0x07, 0x07, 0x07, 0x04, 0x06, + 0x04, 0x04, 0x06, 0x07, 0x01, 0x00, 0x01, 0x01, + 0x07, 0x05, 0x07, 0x07, 0x05, 0x07, 0x06, 0x04, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x07, 0x05, 0x07, 0x07, 0x04, 0x07, + 0x01, 0x01, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x04, 0x07, 0x07, 0x01, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, 0x07, 0x07, + 0x01, 0x00, 0x01, 0x01, 0x04, 0x06, 0x04, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, +}; + +static unsigned char m761[256] = { + 0xc0, 0x70, 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, + 0x40, 0x70, 0x40, 0x70, 0x40, 0xf0, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, 0x40, 0x00, + 0x00, 0xc0, 0x00, 0x40, 0x40, 0x40, 0x40, 0xf0, + 0xf0, 0xf0, 0xf0, 0x40, 0xf0, 0x40, 0xc0, 0x70, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x70, 0x00, 0x40, 0x40, 0x70, 0x40, 0x00, 0x00, + 0x40, 0x40, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x70, 0x70, + 0x70, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x80, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0xf0, 0x00, + 0x70, 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0x70, 0x00, 0xc0, 0x40, 0x00, 0x70, + 0x70, 0xf0, 0x70, 0x00, 0xf0, 0x40, 0x40, 0x40, + 0xf0, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x70, 0x00, + 0xf0, 0x00, 0x70, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, + 0x70, 0x40, 0x00, 0x70, 0xf0, 0x40, 0xf0, 0xf0, + 0x70, 0x00, 0x00, 0x70, 0x40, 0x40, 0xf0, 0x00, + 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x70, 0x00, + 0x00, 0x70, 0x70, 0x40, 0x40, 0x40, 0x00, 0x40, + 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x40, 0x00, 0x00, 0x40, 0xf0, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, + 0x70, 0x70, 0xf0, 0x00, 0x00, 0x40, 0x00, 0xf0, + 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x40, 0xf0, 0x00, + 0xf0, 0x40, 0xf0, 0x40, 0x40, 0x70, 0x40, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0x00, 0xf0, 0x70, + 0x00, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, + 0x40, 0xf0, 0x00, 0xf0, 0xf0, 0x70, 0x40, 0xf0, + 0x40, 0x00, 0x70, 0x00, 0x40, 0x00, 0xf0, 0x00, + 0x40, 0x40, 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x00, + 0xf0, 0x40, 0x00, 0x70, 0xc0, 0x00, 0xf0, 0x00, +}; + +static unsigned char m762[256] = { + 0x07, 0x07, 0x04, 0x07, 0x00, 0x01, 0x00, 0x04, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x04, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x06, 0x07, 0x06, 0x01, + 0x01, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x07, 0x01, 0x01, 0x04, 0x07, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, 0x04, + 0x07, 0x04, 0x06, 0x04, 0x07, 0x06, 0x01, 0x01, + 0x05, 0x04, 0x06, 0x07, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x07, 0x01, 0x04, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x05, 0x04, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x00, 0x01, 0x06, + 0x06, 0x06, 0x06, 0x01, 0x06, 0x06, 0x00, 0x04, + 0x04, 0x06, 0x06, 0x01, 0x06, 0x06, 0x06, 0x05, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, + 0x07, 0x06, 0x00, 0x07, 0x06, 0x07, 0x07, 0x06, + 0x04, 0x06, 0x07, 0x04, 0x07, 0x04, 0x07, 0x07, + 0x07, 0x06, 0x06, 0x07, 0x04, 0x04, 0x07, 0x06, + 0x04, 0x01, 0x06, 0x07, 0x04, 0x06, 0x07, 0x04, + 0x04, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x07, 0x04, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x01, 0x01, 0x04, 0x07, 0x06, 0x04, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x04, 0x04, 0x07, 0x06, 0x06, 0x07, 0x07, 0x04, + 0x07, 0x06, 0x07, 0x04, 0x04, 0x07, 0x07, 0x01, + 0x01, 0x01, 0x07, 0x06, 0x07, 0x04, 0x05, 0x05, + 0x05, 0x04, 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x07, 0x06, 0x07, 0x06, 0x04, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x04, 0x07, 0x04, +}; + +static unsigned char m771[256] = { + 0x40, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x70, + 0xf0, 0xf0, 0x40, 0xf0, 0x70, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x00, 0x40, 0x40, 0x70, 0x40, 0x00, 0xf0, 0x70, + 0xf0, 0x00, 0x40, 0x00, 0x70, 0x70, 0x70, 0x00, + 0x40, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0xf0, + 0xf0, 0x40, 0xf0, 0x00, 0xf0, 0x40, 0x40, 0x00, + 0xf0, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x70, + 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x40, 0x40, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x00, 0x70, 0xf0, 0x40, 0x00, 0x40, 0x40, + 0x40, 0xf0, 0x40, 0xf0, 0x40, 0x70, 0xf0, 0x40, + 0x70, 0x00, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0x00, 0x40, 0xf0, 0xf0, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x70, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x70, 0x00, 0x40, 0x00, 0x00, 0xf0, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0xf0, 0x40, 0x40, + 0xf0, 0x40, 0x00, 0xf0, 0x00, 0x40, 0x70, 0x00, + 0x00, 0x70, 0x00, 0xf0, 0xf0, 0x70, 0x40, 0xf0, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x00, 0xf0, + 0x00, 0x40, 0x70, 0xf0, 0xf0, 0x00, 0x40, 0x40, + 0x40, 0x00, 0xf0, 0xf0, 0x40, 0xf0, 0x40, 0x70, + 0x00, 0xf0, 0x40, 0x00, 0x40, 0xf0, 0xf0, 0xf0, + 0x40, 0x40, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, +}; + +static unsigned char m772[256] = { + 0x04, 0x07, 0x04, 0x06, 0x07, 0x06, 0x04, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x00, 0x01, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, + 0x04, 0x07, 0x07, 0x06, 0x04, 0x06, 0x04, 0x07, + 0x07, 0x04, 0x07, 0x06, 0x04, 0x06, 0x05, 0x06, + 0x07, 0x07, 0x04, 0x04, 0x00, 0x07, 0x04, 0x07, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x04, + 0x05, 0x05, 0x04, 0x05, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x01, 0x01, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x07, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x04, 0x07, 0x07, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x07, 0x04, 0x04, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x00, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x07, 0x07, 0x07, 0x06, + 0x04, 0x07, 0x01, 0x00, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x06, 0x07, 0x06, 0x04, 0x07, 0x04, 0x07, + 0x06, 0x05, 0x07, 0x06, 0x07, 0x06, 0x04, 0x04, + 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, + 0x04, 0x04, 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, + 0x00, 0x06, 0x06, 0x00, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, 0x06, 0x04, + 0x06, 0x04, 0x07, 0x07, 0x04, 0x07, 0x04, 0x07, + 0x06, 0x07, 0x04, 0x01, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x04, 0x05, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x05, 0x01, +}; + +static unsigned char m781[256] = { + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x70, 0x40, 0x40, 0x00, + 0x00, 0x40, 0xf0, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x70, 0x40, 0x40, 0x40, 0x00, 0xf0, 0xf0, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x00, + 0x40, 0x00, 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x40, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x40, 0x40, 0xf0, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x80, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xf0, 0x40, 0x00, + 0x40, 0x40, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x40, 0xf0, + 0x00, 0x00, 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x40, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0xf0, 0xf0, 0x40, + 0x00, 0xf0, 0x00, 0x70, 0x40, 0x70, 0x00, 0xf0, + 0x40, 0x00, 0x70, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x00, 0x40, 0x00, 0xf0, 0x40, 0x00, 0x00, 0xf0, + 0x40, 0xf0, 0x70, 0x00, 0x40, 0x40, 0x00, 0x70, + 0x40, 0x40, 0x40, 0x40, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xc0, 0xf0, 0x40, 0x70, 0x40, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x70, 0x40, + 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x00, 0xc0, 0x00, + 0xf0, 0x70, 0x40, 0x40, 0x70, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x70, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x40, 0x00, 0x40, 0x70, + 0xf0, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0x40, 0x40, 0x70, 0x80, 0x40, 0x40, + 0x00, 0x00, 0x40, 0xc0, 0x00, 0x70, 0x00, 0x40, +}; + +static unsigned char m782[256] = { + 0x01, 0x01, 0x07, 0x06, 0x04, 0x06, 0x06, 0x04, + 0x04, 0x07, 0x04, 0x04, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x07, 0x04, 0x01, 0x01, + 0x05, 0x04, 0x01, 0x04, 0x01, 0x07, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x07, 0x07, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x07, + 0x07, 0x01, 0x01, 0x01, 0x01, 0x04, 0x01, 0x00, + 0x01, 0x00, 0x04, 0x06, 0x04, 0x07, 0x04, 0x05, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, 0x04, + 0x07, 0x04, 0x07, 0x04, 0x04, 0x01, 0x01, 0x01, + 0x04, 0x00, 0x00, 0x00, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, + 0x04, 0x06, 0x04, 0x06, 0x07, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x07, 0x04, 0x04, 0x07, 0x05, 0x07, 0x06, + 0x04, 0x07, 0x04, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x06, 0x07, 0x01, 0x05, 0x04, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x07, 0x05, 0x07, 0x07, 0x07, 0x00, 0x00, 0x04, + 0x04, 0x05, 0x06, 0x06, 0x06, 0x04, 0x07, 0x04, + 0x04, 0x07, 0x04, 0x06, 0x06, 0x07, 0x04, 0x04, + 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x04, 0x04, 0x07, 0x07, 0x04, 0x00, + 0x04, 0x01, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x04, 0x07, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x07, 0x06, 0x07, 0x00, 0x04, 0x07, + 0x04, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m791[256] = { + 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, + 0x40, 0x70, 0x70, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x00, 0x70, 0x40, 0x00, 0x40, 0x00, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, 0x40, + 0x00, 0x40, 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x40, 0x70, 0x40, 0xf0, 0x40, + 0xf0, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x40, 0xf0, + 0xf0, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, + 0xf0, 0x40, 0x00, 0x70, 0x40, 0x70, 0xf0, 0xf0, + 0x40, 0x00, 0xf0, 0xc0, 0xc0, 0xf0, 0xf0, 0x70, + 0xf0, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x00, 0x40, + 0xf0, 0x40, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x40, 0xf0, 0x40, 0x40, 0x00, 0x40, 0xf0, + 0x70, 0xf0, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x40, 0x40, 0xf0, 0xf0, 0xf0, + 0x00, 0xc0, 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x40, 0x40, 0x70, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, + 0x40, 0x40, 0xf0, 0x40, 0x00, 0x00, 0xf0, 0x40, + 0x70, 0xc0, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x40, 0xf0, 0x70, 0x40, 0x00, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x40, 0x00, 0x40, 0x00, 0x00, 0x40, + 0x40, 0xf0, 0xc0, 0xf0, 0x00, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0xf0, 0x00, 0x40, 0xf0, 0x40, 0x00, + 0xf0, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0xf0, + 0x40, 0x70, 0x40, 0x70, 0xf0, 0x40, 0xf0, 0xf0, + 0x00, 0xf0, 0x40, 0x40, 0x70, 0x40, 0x00, 0x00, + 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, +}; + +static unsigned char m792[256] = { + 0x04, 0x07, 0x06, 0x00, 0x06, 0x07, 0x04, 0x04, + 0x04, 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x00, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x04, 0x00, 0x01, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x07, 0x01, 0x05, 0x06, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x00, 0x06, 0x06, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x04, 0x00, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, + 0x04, 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x06, 0x05, 0x06, 0x06, 0x07, 0x04, 0x07, + 0x07, 0x06, 0x06, 0x06, 0x04, 0x07, 0x04, 0x01, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x05, + 0x01, 0x06, 0x07, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x05, 0x07, 0x06, 0x04, 0x05, 0x01, 0x04, 0x04, + 0x06, 0x04, 0x07, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x04, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x04, 0x07, 0x07, 0x06, + 0x07, 0x07, 0x04, 0x05, 0x04, 0x06, 0x05, 0x04, + 0x06, 0x07, 0x04, 0x07, 0x04, 0x07, 0x06, 0x06, + 0x04, 0x07, 0x07, 0x04, 0x04, 0x07, 0x06, 0x04, + 0x07, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x04, 0x04, 0x07, 0x07, 0x04, 0x07, 0x07, + 0x04, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, + 0x05, 0x04, 0x04, 0x04, 0x00, 0x04, 0x06, 0x06, + 0x07, 0x04, 0x06, 0x07, 0x04, 0x01, 0x00, 0x04, +}; + +static unsigned char m7a1[256] = { + 0xf0, 0x00, 0x40, 0x40, 0x00, 0x80, 0x00, 0x40, + 0xf0, 0x40, 0x40, 0xf0, 0x40, 0xf0, 0x70, 0x00, + 0x00, 0x40, 0x00, 0x00, 0xf0, 0x40, 0x00, 0xf0, + 0x70, 0xf0, 0xf0, 0x40, 0xf0, 0x00, 0x40, 0xf0, + 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0xf0, 0x40, + 0x40, 0xf0, 0x70, 0x00, 0x40, 0x40, 0x80, 0xf0, + 0x40, 0x40, 0x40, 0xf0, 0xf0, 0xf0, 0x70, 0xf0, + 0xf0, 0x00, 0x70, 0x70, 0x40, 0x40, 0xf0, 0x40, + 0x40, 0xf0, 0x00, 0x00, 0x40, 0xf0, 0xf0, 0x70, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0xf0, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x40, 0xf0, 0xf0, 0x70, 0x00, 0x40, 0x00, 0x40, + 0x00, 0xf0, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x40, 0xf0, 0x00, + 0x40, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x40, 0xf0, + 0x40, 0xf0, 0x40, 0x70, 0xf0, 0x40, 0x40, 0x00, + 0xf0, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x40, 0xf0, 0xf0, 0x40, 0xf0, 0x70, 0x70, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xf0, + 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x00, 0xf0, 0xf0, + 0x70, 0x00, 0x00, 0x40, 0x00, 0x40, 0x70, 0x00, + 0x00, 0x40, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x70, 0xf0, 0xf0, 0x40, 0xf0, + 0x70, 0x40, 0xf0, 0xf0, 0x40, 0x70, 0x40, 0x70, + 0x00, 0x40, 0x70, 0x70, 0x00, 0x70, 0x00, 0x80, + 0x00, 0xf0, 0x70, 0x40, 0x70, 0xf0, 0x00, 0xf0, + 0xf0, 0x70, 0x70, 0xf0, 0x00, 0xf0, 0x70, 0x00, + 0x40, 0x40, 0xf0, 0x40, 0x40, 0xf0, 0x00, 0xf0, + 0x70, 0x40, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, + 0x70, 0xf0, 0xf0, 0x40, 0x00, 0x40, 0x40, 0xf0, +}; + +static unsigned char m7a2[256] = { + 0x07, 0x04, 0x07, 0x07, 0x06, 0x06, 0x05, 0x04, + 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, 0x05, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x07, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x04, 0x07, 0x06, + 0x07, 0x04, 0x06, 0x01, 0x00, 0x04, 0x06, 0x04, + 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x05, 0x04, 0x04, 0x04, 0x07, + 0x04, 0x07, 0x04, 0x07, 0x07, 0x07, 0x04, 0x07, + 0x06, 0x04, 0x04, 0x00, 0x06, 0x04, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x01, 0x00, 0x04, 0x06, 0x04, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x06, 0x04, 0x04, 0x07, 0x06, 0x07, 0x01, + 0x07, 0x07, 0x07, 0x06, 0x04, 0x04, 0x06, 0x07, + 0x07, 0x07, 0x04, 0x05, 0x07, 0x06, 0x07, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x01, 0x00, 0x06, + 0x06, 0x05, 0x07, 0x04, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x06, 0x04, 0x04, 0x01, 0x01, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x06, 0x04, 0x01, 0x01, 0x04, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x01, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, 0x07, + 0x06, 0x06, 0x04, 0x00, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x06, 0x07, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x01, 0x04, + 0x06, 0x07, 0x04, 0x04, 0x04, 0x04, 0x01, 0x07, + 0x07, 0x04, 0x04, 0x07, 0x06, 0x07, 0x07, 0x04, + 0x04, 0x04, 0x04, 0x06, 0x04, 0x07, 0x06, 0x07, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, + 0x04, 0x07, 0x07, 0x06, 0x04, 0x07, 0x04, 0x07, +}; + +static unsigned char m7b1[256] = { + 0x00, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x40, + 0x70, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0xf0, + 0x00, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x70, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x40, + 0xf0, 0x00, 0x00, 0x40, 0x00, 0x70, 0xf0, 0x40, + 0x70, 0x40, 0x40, 0x40, 0xf0, 0xc0, 0x40, 0x40, + 0x40, 0x40, 0x00, 0x70, 0x40, 0x70, 0x70, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x40, + 0x70, 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0x40, 0xf0, + 0xf0, 0xf0, 0xf0, 0x00, 0xf0, 0x40, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x40, 0x70, 0x40, 0x70, + 0x00, 0x40, 0x40, 0x00, 0xf0, 0x40, 0xf0, 0x40, + 0x70, 0x70, 0x40, 0x40, 0x70, 0xf0, 0x00, 0x40, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x70, 0xf0, + 0x00, 0x40, 0x00, 0xf0, 0x00, 0x70, 0x40, 0xf0, + 0x40, 0x40, 0x70, 0x00, 0xf0, 0xf0, 0x40, 0xf0, + 0x70, 0x70, 0xf0, 0x40, 0x70, 0xf0, 0x40, 0x70, + 0x40, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x40, 0xf0, 0x00, 0x40, + 0x40, 0xf0, 0x40, 0x00, 0xf0, 0x40, 0x40, 0x00, + 0xf0, 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, + 0xf0, 0xf0, 0x40, 0x00, 0xf0, 0x40, 0xf0, 0xf0, + 0x40, 0xf0, 0x40, 0x70, 0x70, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x00, 0x70, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x70, 0x70, 0x00, + 0x40, 0xf0, 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x70, 0x40, 0x40, 0x70, 0x70, + 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, +}; + +static unsigned char m7b2[256] = { + 0x06, 0x06, 0x00, 0x01, 0x07, 0x06, 0x07, 0x00, + 0x07, 0x06, 0x07, 0x05, 0x04, 0x04, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x05, 0x01, 0x04, 0x04, + 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x04, + 0x07, 0x04, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, + 0x07, 0x04, 0x07, 0x07, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x04, 0x04, + 0x07, 0x04, 0x01, 0x06, 0x01, 0x04, 0x01, 0x04, + 0x06, 0x04, 0x04, 0x04, 0x06, 0x07, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x04, 0x07, 0x04, 0x07, 0x04, + 0x07, 0x04, 0x01, 0x01, 0x00, 0x01, 0x04, 0x04, + 0x07, 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, 0x07, 0x04, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, + 0x06, 0x05, 0x00, 0x05, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x04, 0x06, 0x04, 0x06, 0x07, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x07, 0x06, 0x04, 0x04, 0x07, 0x07, 0x06, 0x07, + 0x06, 0x06, 0x00, 0x06, 0x07, 0x07, 0x04, 0x04, + 0x06, 0x07, 0x05, 0x04, 0x06, 0x04, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x07, 0x07, 0x04, 0x06, + 0x04, 0x07, 0x04, 0x04, 0x07, 0x06, 0x04, 0x06, + 0x07, 0x06, 0x04, 0x04, 0x04, 0x04, 0x06, 0x04, + 0x06, 0x07, 0x04, 0x04, 0x06, 0x04, 0x07, 0x07, + 0x04, 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x00, + 0x04, 0x01, 0x00, 0x01, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x04, 0x04, 0x01, 0x00, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, 0x07, + 0x06, 0x06, 0x04, 0x06, 0x05, 0x06, 0x07, 0x06, +}; + +static unsigned char m7c1[256] = { + 0x70, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0xf0, + 0x00, 0x40, 0x00, 0x40, 0x40, 0x70, 0x40, 0x40, + 0x00, 0x70, 0xf0, 0x70, 0x70, 0x00, 0x00, 0x70, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x80, 0x70, + 0x40, 0xf0, 0x00, 0x70, 0x00, 0x40, 0x40, 0xf0, + 0x40, 0x00, 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, 0x70, + 0x70, 0x40, 0x40, 0x00, 0x00, 0xf0, 0xf0, 0xf0, + 0x70, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x70, + 0x70, 0x40, 0x40, 0x40, 0x70, 0x40, 0x70, 0x00, + 0x70, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x70, + 0xf0, 0x40, 0x00, 0x40, 0xf0, 0x70, 0x00, 0x40, + 0x00, 0x40, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x00, + 0x40, 0x00, 0x40, 0xf0, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x70, 0x00, + 0x00, 0x70, 0x70, 0xf0, 0x00, 0x00, 0x40, 0x40, + 0x00, 0xf0, 0x00, 0x70, 0x00, 0x70, 0x00, 0x40, + 0x70, 0x00, 0xf0, 0x00, 0x40, 0xf0, 0x00, 0xf0, + 0xf0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, 0xf0, + 0x40, 0x70, 0x70, 0x00, 0x70, 0xf0, 0x40, 0xf0, + 0x70, 0x00, 0x00, 0x70, 0x00, 0x70, 0xf0, 0x00, + 0x40, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x40, 0x40, + 0x00, 0xf0, 0x40, 0x40, 0x40, 0x70, 0xf0, 0x40, + 0x70, 0x00, 0x70, 0x00, 0x40, 0x70, 0x00, 0x40, + 0x40, 0x40, 0xf0, 0x00, 0x00, 0x40, 0x70, 0x40, + 0x00, 0x00, 0x70, 0x40, 0x40, 0x40, 0xf0, 0x40, + 0x70, 0x40, 0x40, 0x00, 0x70, 0x40, 0xf0, 0xf0, + 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x40, 0xf0, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x70, 0x00, 0x70, 0x40, 0x70, 0x00, + 0x70, 0x00, 0x70, 0xf0, 0x00, 0x00, 0xf0, 0x00, +}; + +static unsigned char m7c2[256] = { + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x04, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x04, 0x00, 0x04, 0x04, 0x01, 0x00, + 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x00, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x01, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, 0x04, 0x04, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x07, 0x05, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x05, 0x05, 0x07, 0x04, 0x06, + 0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x04, 0x00, + 0x00, 0x07, 0x07, 0x04, 0x06, 0x07, 0x06, 0x07, + 0x07, 0x04, 0x04, 0x04, 0x05, 0x05, 0x07, 0x07, + 0x04, 0x06, 0x07, 0x06, 0x05, 0x07, 0x04, 0x06, + 0x06, 0x04, 0x01, 0x04, 0x04, 0x00, 0x05, 0x06, + 0x04, 0x07, 0x07, 0x07, 0x06, 0x06, 0x04, 0x04, + 0x04, 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x06, + 0x04, 0x05, 0x04, 0x04, 0x04, 0x07, 0x04, 0x05, + 0x07, 0x04, 0x07, 0x06, 0x07, 0x05, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, 0x07, 0x07, + 0x00, 0x07, 0x04, 0x04, 0x07, 0x06, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, 0x06, + 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x07, 0x00, 0x04, 0x07, 0x04, 0x06, 0x06, 0x04, +}; + +static unsigned char m7d1[256] = { + 0xf0, 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0xf0, 0xc0, + 0xc0, 0x40, 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0x40, + 0xf0, 0x40, 0x40, 0x40, 0xf0, 0x70, 0x40, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0x40, 0x40, 0x00, + 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x40, 0xf0, 0xf0, 0x40, 0xf0, 0xf0, + 0xf0, 0x40, 0x70, 0xf0, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x40, 0x40, 0x70, + 0x40, 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, + 0x40, 0x00, 0x00, 0x70, 0x70, 0x40, 0x70, 0x70, + 0xf0, 0x40, 0x00, 0x40, 0x00, 0x00, 0x70, 0x40, + 0x00, 0x40, 0x40, 0x70, 0x40, 0x40, 0xf0, 0x00, + 0x00, 0xf0, 0xf0, 0x70, 0x00, 0x40, 0xf0, 0x40, + 0xf0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0x40, 0xf0, 0xf0, 0xf0, 0x00, 0x70, 0xf0, 0x00, + 0x40, 0xf0, 0x40, 0x40, 0x00, 0x70, 0x00, 0xc0, + 0x00, 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0x00, + 0x40, 0x70, 0x00, 0x40, 0x40, 0x40, 0x80, 0xf0, + 0x00, 0x40, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x70, 0x70, 0x70, 0xf0, 0x40, 0x40, 0x70, + 0x80, 0x00, 0xf0, 0x70, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x00, 0x40, 0x70, 0xf0, 0xf0, 0x70, 0x70, + 0x70, 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0x40, + 0xf0, 0x40, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0xf0, + 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0xf0, + 0x00, 0x00, 0xf0, 0xf0, 0x40, 0x40, 0x40, 0x70, + 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x80, 0x40, + 0xf0, 0x40, 0xf0, 0x00, 0x70, 0xf0, 0xf0, 0x00, + 0xf0, 0xf0, 0x40, 0x80, 0x70, 0x40, 0x40, 0x00, + 0xf0, 0xf0, 0x40, 0x40, 0xf0, 0x40, 0x00, 0xf0, + 0x00, 0x40, 0x70, 0x00, 0xf0, 0x40, 0x40, 0x00, + 0x00, 0x40, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m7d2[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x04, 0x04, 0x04, 0x00, 0x01, + 0x06, 0x06, 0x04, 0x07, 0x06, 0x04, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x01, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x04, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x07, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x04, 0x00, 0x00, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, +}; + +static unsigned char m7e1[256] = { + 0x40, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x40, 0xf0, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x70, 0x00, 0x00, 0xc0, 0x00, 0x40, + 0x00, 0x00, 0x00, 0xf0, 0x40, 0xc0, 0xf0, 0xf0, + 0x40, 0xf0, 0x70, 0xf0, 0x00, 0x00, 0x70, 0x40, + 0x40, 0x00, 0x00, 0xf0, 0x40, 0x40, 0xf0, 0xc0, + 0x00, 0xf0, 0x70, 0x40, 0x00, 0x70, 0x40, 0xf0, + 0x00, 0x70, 0x70, 0x70, 0x00, 0xf0, 0xf0, 0x40, + 0x00, 0xf0, 0x00, 0xf0, 0x40, 0x40, 0xf0, 0xc0, + 0x00, 0x00, 0x70, 0x70, 0x00, 0x70, 0x40, 0x00, + 0x40, 0x00, 0xc0, 0x00, 0xf0, 0xf0, 0x70, 0x00, + 0x40, 0x70, 0x70, 0x00, 0x00, 0x70, 0xf0, 0x40, + 0x00, 0xc0, 0x40, 0x00, 0x00, 0x40, 0x70, 0x70, + 0x00, 0xf0, 0xf0, 0xc0, 0x00, 0xf0, 0x40, 0x40, + 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xf0, 0x00, 0x70, 0xf0, 0x70, 0x40, 0x70, + 0x00, 0x40, 0xf0, 0x70, 0x00, 0x00, 0x40, 0x40, + 0x70, 0x70, 0x40, 0x00, 0xf0, 0x40, 0x70, 0xf0, + 0x70, 0x40, 0x70, 0xf0, 0x70, 0x40, 0xf0, 0x00, + 0xc0, 0x00, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m7e2[256] = { + 0x04, 0x04, 0x04, 0x06, 0x04, 0x00, 0x00, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x00, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x00, 0x00, 0x06, 0x04, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x07, 0x00, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x04, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +}; + +static unsigned char m7f1[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0xf0, 0x00, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x70, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x70, 0x70, 0x40, + 0xf0, 0x70, 0x40, 0x40, 0xf0, 0xf0, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x70, + 0x70, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x70, + 0x70, 0x70, 0xf0, 0xf0, 0x00, 0x40, 0xf0, 0x00, + 0xf0, 0x40, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, + 0x70, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x70, 0x70, 0x00, 0xf0, 0x70, 0x70, + 0xf0, 0x00, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x40, + 0x40, 0x40, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x40, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0x70, 0xf0, 0x00, + 0x00, 0x40, 0x40, 0x70, 0xf0, 0x00, 0x40, 0x00, + 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x70, 0x70, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0x00, 0x70, 0x00, + 0xf0, 0xf0, 0x00, 0x00, 0x40, 0xf0, 0x00, 0x40, + 0x40, 0xf0, 0x00, 0x40, 0x00, 0xf0, 0x70, 0x00, + 0x40, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xc0, 0x40, + 0x00, 0x00, 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xc0, + 0xf0, 0xf0, 0x00, 0x40, 0x00, 0x40, 0x70, 0x00, + 0x40, 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x40, 0x40, + 0xf0, 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x70, 0xf0, 0x40, 0x40, 0x40, +}; + +static unsigned char m7f2[256] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x04, + 0x07, 0x06, 0x07, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x01, 0x06, 0x07, 0x07, 0x04, 0x04, + 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x07, 0x07, 0x04, 0x00, 0x07, 0x07, 0x00, 0x05, + 0x07, 0x04, 0x01, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x05, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x04, + 0x06, 0x05, 0x07, 0x06, 0x01, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x04, 0x01, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, 0x04, + 0x04, 0x04, 0x07, 0x06, 0x06, 0x07, 0x07, 0x01, + 0x06, 0x07, 0x06, 0x04, 0x07, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x04, 0x07, + 0x07, 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x07, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x04, 0x07, 0x04, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x07, 0x04, 0x06, + 0x01, 0x00, 0x00, 0x06, 0x06, 0x04, 0x06, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x04, 0x07, 0x07, 0x04, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x07, 0x07, 0x06, 0x06, 0x06, +}; + +static unsigned char m801[256] = { + 0xf0, 0xf0, 0x00, 0xf0, 0x70, 0xf0, 0xf0, 0x40, + 0x40, 0x80, 0x40, 0x70, 0xf0, 0x40, 0x40, 0x40, + 0xf0, 0x40, 0x70, 0x40, 0x40, 0xf0, 0x40, 0xf0, + 0xf0, 0x70, 0x00, 0x00, 0x70, 0x40, 0x40, 0x40, + 0x40, 0x70, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x40, 0x80, 0x40, 0x00, + 0x40, 0x00, 0x00, 0xf0, 0x40, 0x40, 0xf0, 0x40, + 0x00, 0x40, 0x40, 0x70, 0x40, 0xf0, 0x40, 0xf0, + 0x40, 0x00, 0x00, 0x80, 0x40, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xf0, 0x00, + 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x70, + 0x40, 0x70, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xf0, + 0xf0, 0x40, 0xf0, 0xf0, 0x70, 0x40, 0x70, 0xf0, + 0x00, 0x70, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, + 0x00, 0x40, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, + 0x40, 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x00, + 0x70, 0x00, 0x70, 0xf0, 0x40, 0xf0, 0x40, 0x00, + 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x40, 0x40, + 0x00, 0xf0, 0xf0, 0x40, 0x70, 0x70, 0x00, 0xf0, + 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x40, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x70, 0x00, + 0x40, 0x00, 0x00, 0x00, 0xf0, 0x40, 0xf0, 0x40, + 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x70, 0x40, + 0x40, 0x70, 0xf0, 0xf0, 0x00, 0x70, 0xf0, 0x00, + 0x40, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x70, + 0x40, 0xf0, 0x40, 0x40, 0xf0, 0x00, 0x40, 0x00, + 0xf0, 0x40, 0x40, 0x00, 0x70, 0xf0, 0x40, 0x00, +}; + +static unsigned char m802[256] = { + 0x07, 0x07, 0x04, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x04, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x06, 0x07, 0x04, 0x06, 0x06, + 0x05, 0x06, 0x01, 0x04, 0x06, 0x05, 0x07, 0x01, + 0x07, 0x07, 0x07, 0x04, 0x06, 0x04, 0x04, 0x04, + 0x06, 0x05, 0x04, 0x07, 0x06, 0x07, 0x07, 0x07, + 0x05, 0x06, 0x04, 0x05, 0x04, 0x07, 0x06, 0x07, + 0x04, 0x04, 0x01, 0x07, 0x04, 0x04, 0x07, 0x06, + 0x06, 0x04, 0x07, 0x01, 0x01, 0x01, 0x04, 0x06, + 0x06, 0x06, 0x07, 0x04, 0x01, 0x04, 0x06, 0x04, + 0x07, 0x04, 0x07, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x04, 0x00, 0x04, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x01, 0x05, 0x04, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x07, + 0x01, 0x04, 0x06, 0x01, 0x07, 0x06, 0x07, 0x07, + 0x04, 0x07, 0x06, 0x07, 0x07, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x07, 0x04, 0x06, 0x07, 0x04, + 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x04, 0x05, + 0x01, 0x07, 0x07, 0x06, 0x05, 0x07, 0x04, 0x04, + 0x04, 0x07, 0x07, 0x07, 0x04, 0x07, 0x07, 0x07, + 0x04, 0x07, 0x07, 0x04, 0x07, 0x06, 0x04, 0x05, + 0x06, 0x04, 0x07, 0x04, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x07, 0x07, 0x07, 0x06, 0x05, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, + 0x06, 0x07, 0x04, 0x06, 0x07, 0x07, 0x06, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x04, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x04, + 0x07, 0x06, 0x07, 0x06, 0x07, 0x07, 0x06, 0x04, +}; + +static unsigned char m811[256] = { + 0x00, 0x00, 0xf0, 0x40, 0x00, 0xf0, 0xf0, 0xf0, + 0xf0, 0x70, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, + 0xc0, 0x00, 0xf0, 0xf0, 0x40, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0x00, 0x80, 0x40, 0x00, 0x00, 0xf0, + 0x40, 0x70, 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0x40, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, 0x40, + 0x00, 0x00, 0x40, 0xf0, 0x40, 0x00, 0xf0, 0x00, + 0xf0, 0xf0, 0x40, 0x70, 0xf0, 0xf0, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x40, 0x40, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x40, + 0x40, 0x40, 0x00, 0xf0, 0x00, 0x40, 0x70, 0x40, + 0xf0, 0xf0, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, + 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0xf0, 0x40, 0x70, 0x70, 0x40, 0x40, 0x40, 0x00, + 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x40, 0xf0, + 0x40, 0x00, 0x00, 0x70, 0x00, 0x70, 0x40, 0x00, + 0x40, 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0x00, + 0xf0, 0x00, 0x40, 0xf0, 0x70, 0x00, 0x00, 0x00, + 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x70, 0x00, 0x40, 0xf0, 0x40, 0xf0, 0x00, 0x00, + 0x70, 0x00, 0xf0, 0x40, 0x00, 0xf0, 0xf0, 0xf0, + 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x40, 0xf0, 0x00, + 0x70, 0x70, 0x40, 0x40, 0x00, 0xf0, 0x40, 0x40, + 0x00, 0x70, 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, + 0xf0, 0x70, 0x70, 0x40, 0x00, 0x40, 0x40, 0xf0, + 0x70, 0x40, 0x00, 0xf0, 0x40, 0xf0, 0x00, 0xf0, + 0xf0, 0x00, 0xf0, 0x40, 0x40, 0xf0, 0x00, 0x00, + 0x40, 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0x00, + 0x40, 0x40, 0xf0, 0xf0, 0xf0, 0x40, 0xf0, 0x40, +}; + +static unsigned char m812[256] = { + 0x06, 0x06, 0x07, 0x04, 0x04, 0x06, 0x07, 0x04, + 0x06, 0x05, 0x07, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x05, 0x06, 0x07, 0x04, + 0x07, 0x06, 0x05, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x07, 0x06, 0x04, 0x07, + 0x06, 0x05, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, + 0x01, 0x06, 0x06, 0x04, 0x04, 0x06, 0x07, 0x04, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x07, 0x06, + 0x05, 0x04, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x00, 0x00, + 0x04, 0x01, 0x01, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x07, 0x06, 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, + 0x04, 0x07, 0x04, 0x06, 0x04, 0x05, 0x07, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x01, 0x01, 0x05, 0x01, 0x07, + 0x07, 0x04, 0x07, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x07, + 0x04, 0x01, 0x04, 0x04, 0x04, 0x06, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x07, 0x00, 0x00, 0x07, 0x06, + 0x07, 0x06, 0x05, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x00, 0x06, + 0x04, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x05, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, + 0x04, 0x06, 0x07, 0x04, 0x07, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x07, 0x04, 0x07, 0x07, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x07, 0x07, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, 0x07, 0x06, +}; + +static unsigned char m821[256] = { + 0x40, 0x70, 0x70, 0x40, 0x00, 0xf0, 0x00, 0xf0, + 0xf0, 0x70, 0xf0, 0x00, 0xf0, 0xf0, 0x70, 0x40, + 0x70, 0x00, 0xf0, 0x40, 0x40, 0x00, 0x70, 0x70, + 0x70, 0x40, 0x40, 0xf0, 0xf0, 0x40, 0xf0, 0xf0, + 0x00, 0xc0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x70, 0xf0, 0xf0, 0xf0, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x40, 0x70, 0x40, 0xf0, 0xf0, 0xf0, + 0x70, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x40, 0x40, 0xc0, 0x40, 0xf0, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x70, 0xf0, 0x70, 0x00, 0x40, 0x70, 0x00, 0x70, + 0x40, 0x00, 0x70, 0x40, 0xf0, 0x00, 0xf0, 0x40, + 0x70, 0x00, 0x70, 0x70, 0x00, 0x40, 0xf0, 0xf0, + 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x00, 0xf0, 0x70, + 0xf0, 0x00, 0x00, 0x40, 0x00, 0x40, 0xf0, 0x40, + 0x40, 0x40, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x40, 0x40, 0xf0, 0x00, 0xf0, 0xc0, 0x00, + 0x00, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x40, 0x00, + 0x40, 0xf0, 0xc0, 0x40, 0x00, 0xf0, 0x00, 0xf0, + 0x40, 0x40, 0x00, 0x40, 0x40, 0xf0, 0xf0, 0x40, + 0x40, 0xc0, 0x40, 0x70, 0xf0, 0xf0, 0xc0, 0xf0, + 0x40, 0xf0, 0x40, 0xf0, 0x40, 0x00, 0x00, 0xc0, + 0xf0, 0xf0, 0x40, 0xf0, 0xc0, 0xf0, 0x40, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xf0, 0xf0, 0x70, 0xf0, 0xc0, 0x00, 0xf0, + 0x00, 0x70, 0x40, 0xf0, 0x70, 0x00, 0xf0, 0xf0, + 0x40, 0xf0, 0x40, 0x70, 0x40, 0xf0, 0xf0, 0xf0, + 0x40, 0x00, 0x40, 0x70, 0x00, 0x40, 0x00, 0x40, + 0x00, 0xf0, 0x00, 0x70, 0x70, 0x00, 0x40, 0x40, + 0x00, 0x70, 0x70, 0x70, 0x00, 0xc0, 0xc0, 0x00, +}; + +static unsigned char m822[256] = { + 0x07, 0x07, 0x07, 0x04, 0x07, 0x07, 0x01, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, 0x04, + 0x07, 0x06, 0x07, 0x04, 0x07, 0x06, 0x06, 0x00, + 0x04, 0x04, 0x04, 0x07, 0x07, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x07, 0x01, 0x04, 0x06, 0x04, 0x04, + 0x07, 0x04, 0x07, 0x07, 0x07, 0x05, 0x00, 0x07, + 0x01, 0x01, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x06, 0x01, 0x06, 0x06, 0x01, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x07, 0x06, 0x04, 0x07, + 0x04, 0x07, 0x04, 0x07, 0x04, 0x00, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x06, 0x06, 0x00, 0x06, 0x07, + 0x00, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x01, 0x06, 0x07, 0x05, 0x07, 0x06, 0x04, 0x06, + 0x06, 0x05, 0x01, 0x04, 0x06, 0x07, 0x07, 0x07, + 0x06, 0x04, 0x01, 0x06, 0x07, 0x06, 0x04, 0x04, + 0x01, 0x04, 0x07, 0x07, 0x04, 0x07, 0x07, 0x07, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x04, 0x01, + 0x07, 0x07, 0x06, 0x06, 0x05, 0x07, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, 0x05, 0x06, + 0x07, 0x07, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x07, 0x07, 0x06, 0x06, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, + 0x06, 0x05, 0x06, 0x06, 0x05, 0x04, 0x00, 0x01, + 0x01, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x07, + 0x05, 0x06, 0x04, 0x07, 0x07, 0x04, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x07, 0x06, 0x06, 0x04, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x05, + 0x04, 0x07, 0x06, 0x07, 0x04, 0x04, 0x06, 0x04, +}; + +static unsigned char m831[256] = { + 0x40, 0xc0, 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0x40, + 0x40, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, + 0x70, 0x00, 0x00, 0x40, 0x70, 0x40, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x40, 0xf0, + 0x40, 0xf0, 0x70, 0x40, 0xf0, 0xf0, 0xf0, 0x40, + 0xf0, 0xf0, 0x40, 0x00, 0x40, 0x40, 0x00, 0x00, + 0xf0, 0x00, 0x40, 0x40, 0x40, 0x70, 0x00, 0xc0, + 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x40, 0x40, 0xf0, + 0x70, 0xc0, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0xf0, 0x00, 0x70, 0x00, 0xf0, + 0x40, 0x00, 0x00, 0xf0, 0x70, 0x40, 0x00, 0x40, + 0x40, 0x00, 0x40, 0x00, 0x40, 0x70, 0x40, 0x70, + 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x40, 0xf0, 0x00, + 0x00, 0x00, 0x40, 0x70, 0x40, 0x40, 0xf0, 0x00, + 0xc0, 0x40, 0x70, 0x40, 0x40, 0x40, 0xf0, 0x70, + 0x70, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x70, 0xc0, 0xf0, 0xf0, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, + 0x40, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, + 0x00, 0xc0, 0xf0, 0x00, 0xf0, 0x00, 0x70, 0x40, + 0x40, 0x40, 0x00, 0xf0, 0x40, 0x00, 0xf0, 0x00, + 0x70, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x00, 0x70, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xf0, 0x40, 0xf0, 0x00, 0x00, 0x00, 0xf0, + 0xf0, 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x70, + 0x40, 0xc0, 0x00, 0x70, 0x40, 0xf0, 0x00, 0x00, +}; + +static unsigned char m832[256] = { + 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x04, 0x07, 0x06, 0x05, 0x01, + 0x04, 0x01, 0x04, 0x00, 0x01, 0x01, 0x06, 0x07, + 0x04, 0x06, 0x05, 0x07, 0x07, 0x04, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, 0x07, + 0x04, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x07, 0x04, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x05, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x06, 0x07, 0x04, 0x06, 0x04, + 0x04, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x04, 0x05, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x04, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x05, 0x07, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x05, 0x06, 0x07, 0x04, + 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x04, 0x04, 0x06, 0x06, + 0x07, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x05, + 0x01, 0x05, 0x01, 0x00, 0x01, 0x07, 0x04, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, + 0x04, 0x06, 0x04, 0x04, 0x07, 0x06, 0x07, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x07, 0x07, 0x06, 0x07, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, +}; + +static unsigned char m841[256] = { + 0x00, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x70, + 0x00, 0x00, 0xc0, 0x70, 0xf0, 0xf0, 0xf0, 0x40, + 0x00, 0x40, 0x00, 0x70, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x70, 0x00, 0xf0, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0xf0, 0x40, 0x00, 0x00, 0x70, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, 0x40, + 0x40, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x70, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0xf0, + 0x40, 0x40, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0x40, 0xf0, 0x70, 0xf0, 0x40, 0x40, 0xf0, 0x40, + 0x00, 0x70, 0x40, 0xf0, 0xf0, 0x70, 0x70, 0xf0, + 0x40, 0x70, 0x00, 0x40, 0x40, 0xf0, 0x40, 0x70, + 0x40, 0x70, 0xf0, 0x00, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x70, 0x00, 0x70, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x40, 0x40, 0xf0, 0x40, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x70, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x70, 0x00, 0x40, + 0x00, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x00, + 0xf0, 0x70, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0xf0, + 0xc0, 0x70, 0xc0, 0x00, 0xf0, 0x00, 0xf0, 0x40, + 0x40, 0xf0, 0x70, 0xf0, 0x40, 0xf0, 0x00, 0x40, + 0x70, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x70, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, 0xf0, 0x40, + 0x40, 0x40, 0x40, 0x00, 0xf0, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x40, 0xf0, 0x40, 0x00, 0x70, +}; + +static unsigned char m842[256] = { + 0x04, 0x07, 0x04, 0x07, 0x07, 0x04, 0x07, 0x06, + 0x04, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x00, 0x00, 0x06, 0x01, 0x01, 0x04, 0x04, + 0x00, 0x04, 0x00, 0x06, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x04, 0x06, 0x07, + 0x04, 0x07, 0x07, 0x07, 0x05, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x07, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x05, 0x04, 0x07, 0x06, 0x07, 0x07, 0x06, + 0x07, 0x06, 0x07, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x06, 0x01, + 0x05, 0x01, 0x00, 0x01, 0x01, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x07, + 0x06, 0x06, 0x07, 0x04, 0x07, 0x04, 0x06, 0x04, + 0x07, 0x07, 0x07, 0x06, 0x06, 0x05, 0x04, 0x07, + 0x06, 0x07, 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x06, 0x04, 0x07, 0x06, + 0x04, 0x00, 0x04, 0x06, 0x00, 0x01, 0x04, 0x01, + 0x01, 0x04, 0x04, 0x01, 0x04, 0x01, 0x01, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, +}; + +static unsigned char m851[256] = { + 0x70, 0x00, 0x40, 0x40, 0x00, 0x00, 0x70, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, + 0x40, 0xf0, 0x00, 0xf0, 0xf0, 0x70, 0x00, 0xf0, + 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x00, 0xc0, 0x70, + 0x00, 0xf0, 0x40, 0xc0, 0x40, 0xc0, 0x70, 0x40, + 0x00, 0x00, 0x40, 0x40, 0xf0, 0xf0, 0x00, 0xc0, + 0x00, 0x00, 0x40, 0x40, 0x40, 0x70, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, + 0x70, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x00, + 0x70, 0xf0, 0x70, 0x70, 0x00, 0x00, 0xf0, 0x40, + 0x40, 0x40, 0x40, 0xc0, 0x00, 0x70, 0x40, 0x70, + 0x70, 0xc0, 0x70, 0x00, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0xf0, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x40, 0x40, 0x40, 0x00, 0x40, 0x70, 0x40, + 0x70, 0x40, 0x00, 0x00, 0xf0, 0x40, 0x40, 0xf0, + 0x70, 0x40, 0x70, 0x40, 0x40, 0x00, 0x00, 0xc0, + 0x70, 0xf0, 0x00, 0x40, 0xf0, 0x00, 0x00, 0x70, + 0x40, 0x70, 0x00, 0xf0, 0x70, 0x40, 0x00, 0x40, + 0x40, 0x00, 0x40, 0x00, 0x70, 0x40, 0xf0, 0x40, + 0xf0, 0xf0, 0xf0, 0x70, 0x70, 0x40, 0x70, 0xf0, + 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, + 0x40, 0x70, 0xf0, 0x00, 0x40, 0x40, 0x40, 0x40, + 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0x40, 0x40, 0x00, 0xf0, 0xc0, 0xf0, + 0x70, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x40, 0x00, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x40, 0x00, + 0x40, 0xf0, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xf0, + 0x00, 0x70, 0xf0, 0xf0, 0x40, 0x00, 0x70, 0xc0, +}; + +static unsigned char m852[256] = { + 0x06, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x00, 0x01, + 0x05, 0x01, 0x01, 0x07, 0x01, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x04, 0x06, 0x07, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x01, 0x04, 0x01, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x06, 0x04, 0x07, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x04, 0x04, 0x00, 0x01, 0x07, + 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x07, 0x06, 0x06, 0x01, 0x04, 0x07, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x04, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x07, +}; + +static unsigned char m861[256] = { + 0x40, 0x00, 0xf0, 0x00, 0x40, 0x40, 0xf0, 0xf0, + 0x00, 0x00, 0xf0, 0x70, 0x00, 0x40, 0x40, 0x00, + 0x40, 0x40, 0x40, 0x70, 0x00, 0x00, 0xf0, 0xf0, + 0x40, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x40, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x70, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x40, 0x00, 0x40, 0x40, 0x00, 0xf0, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x00, + 0xf0, 0x00, 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x40, + 0x40, 0x40, 0x70, 0x80, 0xf0, 0x40, 0xf0, 0xf0, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0xf0, + 0x00, 0x40, 0x00, 0x70, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x00, 0xf0, 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0xf0, 0x70, 0xf0, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x00, 0xf0, 0x00, 0x70, 0x40, 0x00, + 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x40, + 0x40, 0xf0, 0x70, 0x70, 0x00, 0x40, 0x00, 0x70, + 0x70, 0x40, 0x00, 0x40, 0x40, 0x40, 0x70, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x40, 0x70, 0x40, 0x70, 0xf0, + 0x00, 0x70, 0x00, 0xf0, 0x00, 0x70, 0x70, 0x00, + 0x00, 0x40, 0x40, 0x00, 0xf0, 0x40, 0x00, 0x40, + 0x00, 0xf0, 0x40, 0xf0, 0x40, 0x00, 0x70, 0xf0, + 0x40, 0x00, 0x00, 0x40, 0xf0, 0x40, 0x00, 0x40, + 0x00, 0x70, 0x00, 0x00, 0x70, 0xf0, 0x70, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x70, 0x40, 0x70, 0x40, 0x40, 0xf0, 0x00, +}; + +static unsigned char m862[256] = { + 0x06, 0x06, 0x04, 0x04, 0x06, 0x07, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, + 0x04, 0x07, 0x00, 0x04, 0x00, 0x04, 0x05, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x00, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x07, 0x07, 0x01, + 0x07, 0x05, 0x06, 0x06, 0x07, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x05, 0x06, 0x06, 0x04, 0x07, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x05, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x07, 0x07, 0x07, 0x07, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x07, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x07, 0x07, 0x06, 0x04, 0x07, + 0x07, 0x07, 0x07, 0x00, 0x01, 0x04, 0x04, 0x07, + 0x07, 0x07, 0x04, 0x06, 0x07, 0x07, 0x07, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x05, 0x07, 0x06, 0x00, 0x01, 0x05, + 0x07, 0x07, 0x04, 0x06, 0x07, 0x04, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x07, 0x04, 0x06, 0x04, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, 0x05, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x04, 0x04, 0x07, 0x04, +}; + +static unsigned char m871[256] = { + 0xf0, 0x00, 0xf0, 0xf0, 0x40, 0x40, 0x70, 0x40, + 0xf0, 0x70, 0x70, 0x40, 0x00, 0x70, 0x40, 0x40, + 0x40, 0x70, 0x70, 0x40, 0x40, 0x00, 0x00, 0x00, + 0xf0, 0x40, 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x70, 0x00, 0x00, + 0x40, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x70, 0x00, 0x00, 0x70, + 0x00, 0x40, 0x40, 0x70, 0x40, 0x40, 0x40, 0x70, + 0x40, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x70, 0x70, 0x40, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0xf0, 0x00, 0xf0, + 0x40, 0x70, 0x00, 0x00, 0x00, 0x40, 0x00, 0xf0, + 0x70, 0x40, 0x00, 0x70, 0x40, 0x40, 0xf0, 0x00, + 0xf0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x70, 0x40, + 0x00, 0x40, 0x40, 0x00, 0xf0, 0x00, 0xf0, 0x00, + 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x00, 0x40, 0x40, 0xf0, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0xf0, + 0x40, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x70, 0x40, 0x40, 0x40, 0x70, + 0x00, 0x40, 0x00, 0xf0, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x70, 0x00, 0x70, 0x40, 0x40, + 0x70, 0x40, 0x00, 0x00, 0xf0, 0x00, 0x70, 0x70, + 0x40, 0x40, 0x40, 0x70, 0x00, 0x00, 0x40, 0x00, + 0x70, 0x00, 0x70, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, 0x40, + 0xf0, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x80, 0x40, 0x00, 0xf0, + 0x00, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x70, 0x70, + 0x40, 0xf0, 0x40, 0xf0, 0x00, 0x00, 0xf0, 0x40, +}; + +static unsigned char m872[256] = { + 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x04, 0x06, 0x07, 0x07, 0x04, 0x05, 0x04, 0x01, + 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, + 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x07, 0x04, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x04, 0x07, + 0x06, 0x04, 0x06, 0x07, 0x06, 0x04, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x05, + 0x01, 0x01, 0x04, 0x00, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x05, 0x04, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x05, 0x05, 0x01, 0x00, + 0x00, 0x06, 0x07, 0x07, 0x06, 0x07, 0x04, 0x06, + 0x07, 0x06, 0x04, 0x05, 0x04, 0x07, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x00, 0x00, + 0x01, 0x04, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, 0x04, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x04, 0x04, 0x00, + 0x00, 0x07, 0x07, 0x07, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, 0x05, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, +}; + +static unsigned char m881[256] = { + 0x00, 0x40, 0x00, 0x40, 0x00, 0xf0, 0x40, 0x00, + 0x00, 0x40, 0x40, 0x40, 0x00, 0x70, 0x70, 0x70, + 0x40, 0x70, 0x40, 0x40, 0x40, 0x70, 0x70, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0xc0, + 0x00, 0x70, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x70, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x40, 0xf0, 0x40, 0x00, 0x00, 0x40, 0xf0, 0x00, + 0x00, 0x70, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0xf0, 0x40, 0x70, 0x40, 0x70, 0x40, 0xf0, 0x00, + 0x40, 0x40, 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x00, + 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x40, 0x40, 0xf0, + 0x40, 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x70, 0x40, + 0x40, 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0x00, 0x00, + 0xf0, 0x40, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x40, 0xf0, 0x00, 0x00, 0x70, 0x00, 0xf0, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x70, 0xf0, 0xf0, + 0x40, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0xf0, + 0x40, 0x70, 0x40, 0x40, 0x40, 0x00, 0xf0, 0x40, + 0x40, 0x00, 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x40, 0xf0, 0x00, 0x00, 0x70, 0x00, + 0x70, 0x70, 0x00, 0x00, 0xf0, 0x70, 0x00, 0x70, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x70, + 0x40, 0xf0, 0xf0, 0x70, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0xf0, + 0x00, 0x40, 0x40, 0x40, 0xf0, 0xf0, 0x00, 0x00, + 0x70, 0xf0, 0x00, 0x40, 0xf0, 0xf0, 0x40, 0xf0, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x40, 0x70, 0xf0, 0xf0, 0xc0, 0x00, 0x40, + 0xf0, 0x70, 0x00, 0x00, 0x70, 0xf0, 0x70, 0x00, +}; + +static unsigned char m882[256] = { + 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, 0x07, 0x06, + 0x04, 0x06, 0x04, 0x07, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x07, 0x05, 0x04, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x07, 0x07, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x01, 0x06, 0x06, 0x07, + 0x04, 0x07, 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, + 0x04, 0x07, 0x07, 0x07, 0x01, 0x01, 0x04, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x01, 0x06, 0x05, 0x06, + 0x07, 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x06, 0x04, 0x04, 0x06, 0x07, 0x07, 0x07, + 0x06, 0x07, 0x07, 0x06, 0x05, 0x01, 0x00, 0x04, + 0x07, 0x06, 0x04, 0x07, 0x06, 0x07, 0x06, 0x04, + 0x04, 0x06, 0x07, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x05, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x07, 0x04, 0x07, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x07, 0x06, 0x01, 0x00, 0x00, + 0x00, 0x07, 0x06, 0x04, 0x04, 0x04, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, 0x04, + 0x06, 0x07, 0x07, 0x00, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x07, 0x04, 0x07, 0x07, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x06, 0x01, 0x01, 0x01, 0x01, 0x04, 0x06, + 0x07, 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x07, 0x07, 0x04, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, 0x04, +}; + +static unsigned char m891[256] = { + 0x00, 0x40, 0x70, 0x00, 0x70, 0x00, 0x40, 0xf0, + 0x00, 0x00, 0x70, 0x00, 0x70, 0x40, 0x40, 0x40, + 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x40, 0x00, + 0xc0, 0xc0, 0x40, 0x00, 0x40, 0x70, 0x70, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, + 0x40, 0x00, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, 0xf0, 0x00, + 0xf0, 0x40, 0x40, 0xf0, 0x00, 0x00, 0x40, 0x00, + 0x40, 0xf0, 0x40, 0x70, 0xf0, 0x40, 0x40, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x70, 0x70, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x70, 0x40, + 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x70, 0xf0, + 0x70, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x70, 0x00, + 0x00, 0x00, 0xf0, 0x40, 0x00, 0x70, 0x40, 0x70, + 0x40, 0x00, 0xf0, 0x40, 0x70, 0x40, 0x00, 0x70, + 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x70, 0xf0, + 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0xf0, + 0x70, 0x40, 0x70, 0xf0, 0x00, 0x40, 0x00, 0xf0, + 0x40, 0x00, 0x00, 0xf0, 0x40, 0x40, 0xf0, 0x70, + 0x70, 0x00, 0x70, 0x40, 0x40, 0x00, 0x00, 0x40, + 0x40, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x70, 0x70, + 0x00, 0xf0, 0xf0, 0x00, 0x70, 0x00, 0x00, 0x70, + 0x40, 0x00, 0xf0, 0x70, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0xf0, 0x00, 0x70, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x70, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x70, 0x70, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x40, 0xf0, 0x00, 0x40, 0x00, + 0xf0, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, +}; + +static unsigned char m892[256] = { + 0x04, 0x06, 0x07, 0x04, 0x00, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x07, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x05, 0x00, 0x00, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, + 0x04, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x01, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x07, 0x06, 0x04, 0x07, 0x00, 0x06, 0x00, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x07, 0x04, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x07, + 0x00, 0x07, 0x06, 0x07, 0x04, 0x06, 0x07, 0x04, + 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, + 0x04, 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x07, 0x06, 0x06, 0x06, 0x07, 0x04, + 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, 0x04, + 0x06, 0x06, 0x04, 0x07, 0x06, 0x06, 0x04, 0x01, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, +}; + +static unsigned char m8a1[256] = { + 0xf0, 0x00, 0xf0, 0xf0, 0x40, 0x40, 0x00, 0x40, + 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x40, + 0x70, 0x40, 0x40, 0xf0, 0x40, 0x40, 0xf0, 0xf0, + 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x40, 0xf0, + 0x40, 0x00, 0x40, 0xf0, 0x40, 0xf0, 0x40, 0x00, + 0x00, 0x00, 0xf0, 0x40, 0x40, 0xf0, 0x00, 0x40, + 0x00, 0xf0, 0x00, 0x70, 0xf0, 0x40, 0xf0, 0x40, + 0x00, 0x00, 0xf0, 0xf0, 0x70, 0x40, 0x40, 0x00, + 0x40, 0x70, 0x00, 0x40, 0x00, 0x40, 0x70, 0x40, + 0x70, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, + 0xf0, 0x70, 0x70, 0x40, 0xf0, 0xf0, 0x40, 0x40, + 0x40, 0x00, 0x00, 0xf0, 0x40, 0x40, 0xf0, 0x00, + 0xf0, 0x40, 0xf0, 0xf0, 0x00, 0x40, 0xf0, 0x40, + 0x00, 0xf0, 0x00, 0x70, 0x70, 0xf0, 0xf0, 0x00, + 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0xc0, 0x40, 0x40, + 0x00, 0xc0, 0x40, 0x40, 0x70, 0x00, 0x40, 0x40, + 0x40, 0x00, 0x70, 0x40, 0x70, 0xf0, 0x40, 0xf0, + 0x00, 0x70, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x40, + 0x40, 0x70, 0x40, 0xf0, 0x00, 0xf0, 0x40, 0x40, + 0xf0, 0x40, 0x70, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, + 0xf0, 0x40, 0x80, 0x00, 0x70, 0x70, 0x40, 0x40, + 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x40, + 0x00, 0xf0, 0x00, 0x40, 0xf0, 0x00, 0xc0, 0xf0, + 0x00, 0x00, 0xf0, 0x40, 0xf0, 0x00, 0x40, 0xf0, + 0x40, 0x40, 0x40, 0xf0, 0x70, 0xf0, 0x00, 0xf0, + 0x00, 0x40, 0xf0, 0x40, 0x40, 0x40, 0xf0, 0x40, + 0x00, 0x00, 0x70, 0xf0, 0xf0, 0x40, 0x70, 0x40, + 0x70, 0xf0, 0x70, 0x00, 0x70, 0x00, 0xf0, 0xf0, + 0x00, 0x00, 0x80, 0xf0, 0x40, 0xf0, 0xf0, 0x00, + 0x40, 0xf0, 0x00, 0x70, 0x40, 0x40, 0xc0, 0xf0, + 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x00, 0xf0, 0x40, +}; + +static unsigned char m8a2[256] = { + 0x07, 0x00, 0x06, 0x06, 0x06, 0x04, 0x04, 0x07, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x04, 0x00, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x01, 0x01, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, 0x00, 0x04, + 0x06, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, +}; + +static unsigned char m8b1[256] = { + 0xf0, 0xf0, 0xf0, 0x00, 0xf0, 0x40, 0x40, 0x70, + 0x00, 0x00, 0x40, 0x40, 0x70, 0x00, 0xf0, 0x00, + 0xf0, 0x40, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0xf0, + 0x00, 0xf0, 0xf0, 0xf0, 0x40, 0xf0, 0x40, 0x40, + 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, + 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0x40, 0x00, 0x00, + 0x40, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, + 0x00, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x70, 0x00, + 0x00, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x40, 0xf0, 0x00, 0x00, 0x70, 0x40, 0xf0, 0xf0, + 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x70, 0x00, + 0xf0, 0x40, 0xf0, 0x70, 0xf0, 0x00, 0x40, 0x70, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x70, 0xf0, 0x40, 0x00, 0xf0, + 0xf0, 0x70, 0x70, 0x00, 0xf0, 0x00, 0x40, 0xf0, + 0x40, 0x40, 0x00, 0x00, 0x40, 0xf0, 0x40, 0x00, + 0xf0, 0x40, 0x00, 0x70, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x40, 0x70, 0x40, 0x70, 0x40, + 0xf0, 0x00, 0xf0, 0xf0, 0x40, 0x40, 0xf0, 0x00, + 0x00, 0x70, 0xf0, 0x00, 0x40, 0x00, 0x40, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m8b2[256] = { + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x00, 0x04, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x00, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +}; + +static unsigned char m8c1[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x40, 0x40, 0x70, 0x00, 0x00, 0x40, 0x40, 0xf0, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, 0xf0, 0x40, + 0xf0, 0x40, 0xf0, 0x40, 0xf0, 0x00, 0x70, 0x40, + 0x70, 0x40, 0x00, 0x40, 0x40, 0xf0, 0x00, 0x40, + 0x40, 0x40, 0xf0, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x00, 0xf0, 0x70, 0x40, 0x40, 0x00, 0x40, 0x00, + 0x40, 0x40, 0xf0, 0xf0, 0x70, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x00, + 0x70, 0xf0, 0xf0, 0x40, 0x70, 0x00, 0x40, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x70, 0x40, 0x40, + 0x00, 0x70, 0xf0, 0x40, 0xf0, 0x70, 0x70, 0x00, + 0x40, 0x00, 0x40, 0x40, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x40, 0x00, 0x40, 0x40, 0xf0, 0xf0, 0x00, + 0xf0, 0xf0, 0xf0, 0x00, 0x40, 0x00, 0x00, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x70, 0x70, 0xf0, + 0xf0, 0x00, 0x70, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, + 0xf0, 0x40, 0x40, 0xf0, 0xf0, 0xf0, 0x00, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0xf0, + 0xf0, 0x40, 0xf0, 0x40, 0x00, 0x70, 0x70, 0x40, + 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x40, 0xf0, 0x70, 0xf0, 0x40, 0xf0, 0x00, + 0xf0, 0x40, 0xf0, 0xf0, 0xf0, 0x00, 0xf0, 0x00, + 0x40, 0x00, 0xf0, 0x00, 0x40, 0xf0, 0x00, 0x40, + 0x40, 0x00, 0x40, 0x00, 0x80, 0x40, 0x00, 0x40, + 0x40, 0x00, 0x70, 0xf0, 0xf0, 0xf0, 0x40, 0x40, +}; + +static unsigned char m8c2[256] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x04, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x04, 0x06, 0x07, 0x06, 0x06, + 0x04, 0x04, 0x07, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x07, 0x07, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x00, 0x06, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x04, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x04, + 0x04, 0x07, 0x07, 0x04, 0x07, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x00, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, +}; + +static unsigned char m8d1[256] = { + 0x00, 0x40, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0xf0, + 0xf0, 0x40, 0xf0, 0x70, 0x00, 0xf0, 0x00, 0x70, + 0x70, 0x00, 0x40, 0xf0, 0x70, 0x00, 0xf0, 0x40, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0xf0, 0x70, + 0x00, 0x40, 0x00, 0xf0, 0x40, 0x70, 0x40, 0x00, + 0xf0, 0x70, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x70, 0x40, 0x00, 0x40, 0xf0, 0x00, 0x00, + 0x40, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x40, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x00, + 0xf0, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x40, + 0x00, 0x40, 0xf0, 0x40, 0x40, 0x00, 0xf0, 0x00, + 0x40, 0x00, 0x70, 0x00, 0x00, 0x40, 0xc0, 0x40, + 0x40, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0x40, 0xf0, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x70, 0x40, + 0x00, 0x40, 0x70, 0xf0, 0x00, 0xf0, 0x00, 0x70, + 0x00, 0xf0, 0x00, 0xf0, 0x40, 0x40, 0x00, 0x40, + 0xf0, 0x00, 0x70, 0x70, 0x40, 0x00, 0x00, 0xf0, + 0x40, 0x40, 0x40, 0xf0, 0x40, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x40, 0x00, 0x70, +}; + +static unsigned char m8d2[256] = { + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x07, 0x04, 0x07, 0x07, + 0x06, 0x06, 0x00, 0x07, 0x06, 0x07, 0x06, 0x06, + 0x07, 0x04, 0x06, 0x07, 0x07, 0x01, 0x07, 0x07, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x04, + 0x06, 0x07, 0x04, 0x04, 0x07, 0x07, 0x04, 0x04, + 0x04, 0x06, 0x07, 0x05, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, 0x07, + 0x06, 0x06, 0x04, 0x07, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x01, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x01, 0x06, 0x07, 0x04, 0x07, 0x04, 0x07, 0x07, + 0x04, 0x06, 0x06, 0x05, 0x01, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x04, 0x07, 0x07, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x04, 0x06, 0x04, 0x06, 0x07, 0x07, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x07, 0x01, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x00, 0x06, 0x06, + 0x07, 0x06, 0x07, 0x07, 0x07, 0x04, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x06, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x07, 0x01, 0x06, 0x07, 0x06, 0x06, +}; + +static unsigned char m8e1[256] = { + 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, + 0x70, 0x70, 0xf0, 0x40, 0x00, 0x00, 0x00, 0xf0, + 0xf0, 0x40, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x70, + 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x40, 0x00, 0x40, 0x70, 0xf0, 0x40, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x40, 0x40, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0, + 0xf0, 0xf0, 0xf0, 0x40, 0x70, 0x40, 0x40, 0x40, + 0x70, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x40, 0x40, 0x40, 0x40, 0xf0, + 0xf0, 0x40, 0x40, 0x70, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x40, 0x40, 0x70, 0x00, 0xf0, 0x00, 0xf0, 0x00, + 0x00, 0x40, 0x40, 0x40, 0x70, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x40, 0x70, 0x70, 0x00, 0xf0, + 0x00, 0x40, 0xf0, 0x70, 0x00, 0xf0, 0x00, 0x00, + 0x40, 0x70, 0x40, 0x70, 0x70, 0x40, 0x00, 0x00, + 0x00, 0x70, 0x40, 0x40, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x40, 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0x70, + 0x70, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x70, 0x00, + 0xc0, 0x40, 0x00, 0x40, 0x40, 0x70, 0x70, 0x40, + 0x70, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x40, + 0x00, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x40, 0x00, 0x00, 0xf0, + 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x00, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0xf0, 0x40, 0x40, 0xf0, 0x70, 0x70, 0xf0, 0x00, +}; + +static unsigned char m8e2[256] = { + 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x04, 0x07, 0x07, 0x04, 0x01, 0x06, 0x00, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x05, 0x06, 0x01, 0x00, 0x07, 0x01, + 0x06, 0x07, 0x04, 0x06, 0x06, 0x07, 0x06, 0x04, + 0x06, 0x07, 0x05, 0x04, 0x06, 0x07, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x04, 0x07, 0x06, 0x04, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x05, 0x01, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x04, 0x07, 0x06, 0x04, 0x07, 0x07, 0x04, 0x07, + 0x05, 0x04, 0x07, 0x06, 0x07, 0x04, 0x07, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x07, 0x00, 0x00, 0x01, + 0x00, 0x07, 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x01, + 0x07, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x00, 0x01, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, 0x04, 0x05, + 0x04, 0x04, 0x07, 0x04, 0x04, 0x00, 0x04, 0x04, + 0x04, 0x04, 0x07, 0x00, 0x04, 0x06, 0x04, 0x04, + 0x06, 0x04, 0x06, 0x04, 0x04, 0x00, 0x04, 0x04, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x00, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, +}; + +static unsigned char m8f1[256] = { + 0x40, 0x00, 0x40, 0xf0, 0x00, 0xf0, 0x00, 0x40, + 0x40, 0xf0, 0x70, 0x00, 0x70, 0x00, 0x00, 0x40, + 0x40, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x40, + 0x40, 0x70, 0x00, 0xf0, 0xf0, 0xf0, 0xc0, 0xf0, + 0x40, 0x40, 0x00, 0x40, 0x00, 0x40, 0xf0, 0xc0, + 0x40, 0xf0, 0xf0, 0x00, 0x40, 0x40, 0x40, 0xf0, + 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x40, 0x40, + 0xf0, 0xf0, 0x40, 0xf0, 0x00, 0x00, 0xf0, 0xf0, + 0x40, 0x40, 0x70, 0x40, 0xf0, 0xf0, 0x70, 0x40, + 0x00, 0xf0, 0x00, 0x00, 0x70, 0xf0, 0xf0, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x70, + 0x40, 0x00, 0x00, 0x00, 0x70, 0xc0, 0x40, 0xf0, + 0x00, 0x70, 0xf0, 0x70, 0x70, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x40, 0x70, 0x70, + 0x40, 0x40, 0x00, 0xf0, 0x40, 0x40, 0xc0, 0x70, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x70, 0xf0, + 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x70, + 0x40, 0x00, 0x70, 0x70, 0x70, 0x00, 0x40, 0x70, + 0x40, 0x40, 0xf0, 0x00, 0x70, 0xf0, 0x40, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, 0xf0, 0x00, + 0x40, 0xf0, 0x40, 0x40, 0xf0, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x70, 0x40, 0x40, 0x70, 0xf0, 0x00, + 0x40, 0x70, 0xf0, 0xf0, 0x00, 0xf0, 0x40, 0x70, + 0xf0, 0x40, 0x80, 0x00, 0x70, 0x40, 0x40, 0xf0, + 0x70, 0xf0, 0x70, 0x40, 0x00, 0xf0, 0x40, 0x00, +}; + +static unsigned char m8f2[256] = { + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x00, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x07, 0x07, 0x04, 0x05, 0x07, + 0x04, 0x04, 0x04, 0x07, 0x04, 0x04, 0x06, 0x04, + 0x07, 0x01, 0x04, 0x01, 0x04, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x06, 0x04, 0x06, 0x04, 0x05, 0x04, + 0x04, 0x05, 0x00, 0x04, 0x04, 0x01, 0x05, 0x06, + 0x04, 0x05, 0x07, 0x04, 0x07, 0x07, 0x06, 0x05, + 0x05, 0x06, 0x04, 0x06, 0x04, 0x06, 0x07, 0x04, + 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x05, 0x05, 0x00, 0x01, 0x05, 0x01, 0x01, 0x05, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x04, + 0x07, 0x05, 0x07, 0x07, 0x04, 0x07, 0x07, 0x04, + 0x07, 0x04, 0x00, 0x01, 0x06, 0x06, 0x06, 0x07, + 0x07, 0x05, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, +}; + +static unsigned char m901[256] = { + 0xf0, 0xf0, 0xc0, 0xf0, 0x40, 0xf0, 0xf0, 0x00, + 0xc0, 0x00, 0x00, 0xf0, 0x40, 0xf0, 0x70, 0xf0, + 0xf0, 0xf0, 0x00, 0x70, 0xf0, 0xf0, 0x70, 0xf0, + 0x40, 0xf0, 0xf0, 0x40, 0x00, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x70, + 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0xf0, 0x40, + 0x00, 0xf0, 0xf0, 0x40, 0x40, 0xf0, 0x70, 0x40, + 0xf0, 0x70, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x40, + 0x00, 0xf0, 0xf0, 0x40, 0x40, 0x70, 0x00, 0xf0, + 0x00, 0x70, 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0x70, + 0xf0, 0xf0, 0x70, 0xf0, 0xf0, 0xf0, 0x70, 0x00, + 0x70, 0xf0, 0x00, 0x40, 0xf0, 0xc0, 0xf0, 0x00, + 0xf0, 0xf0, 0x40, 0xf0, 0x00, 0x70, 0x40, 0x40, + 0x70, 0xf0, 0x00, 0x00, 0x40, 0xf0, 0xf0, 0xf0, + 0x40, 0x00, 0xf0, 0x00, 0x40, 0xf0, 0x70, 0xf0, + 0xf0, 0x40, 0xf0, 0x00, 0xf0, 0xf0, 0x00, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0xf0, + 0xc0, 0x70, 0xf0, 0x40, 0x40, 0x00, 0x40, 0xf0, + 0x40, 0xf0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, + 0x40, 0xc0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x40, 0xc0, 0xf0, 0x00, 0x40, 0xf0, 0x00, + 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0xc0, 0xf0, 0x40, 0x40, 0x40, 0xf0, 0x40, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0xf0, 0x00, 0x40, 0x40, 0x40, 0x00, 0x40, + 0x40, 0x00, 0xf0, 0x00, 0x40, 0x00, 0x70, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x70, 0x40, 0x40, 0x80, 0x40, + 0x00, 0xf0, 0x70, 0x00, 0x70, 0x40, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x40, 0xf0, 0x40, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, +}; + +static unsigned char m902[256] = { + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, + 0x04, 0x05, 0x01, 0x07, 0x06, 0x07, 0x04, 0x07, + 0x07, 0x07, 0x05, 0x04, 0x07, 0x06, 0x07, 0x07, + 0x04, 0x06, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x06, 0x06, 0x04, 0x01, 0x00, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x07, 0x07, 0x04, + 0x07, 0x00, 0x04, 0x05, 0x07, 0x06, 0x07, 0x06, + 0x04, 0x07, 0x07, 0x04, 0x07, 0x04, 0x04, 0x07, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x00, 0x01, + 0x07, 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x07, 0x07, 0x04, 0x01, 0x04, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x04, 0x07, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, + 0x07, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x04, 0x06, 0x07, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x04, 0x07, + 0x06, 0x07, 0x04, 0x07, 0x04, 0x01, 0x06, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x04, 0x06, 0x07, 0x06, + 0x04, 0x04, 0x07, 0x04, 0x01, 0x04, 0x05, 0x07, + 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x04, + 0x07, 0x05, 0x01, 0x01, 0x04, 0x06, 0x07, 0x06, + 0x04, 0x07, 0x04, 0x06, 0x05, 0x07, 0x04, 0x07, + 0x06, 0x04, 0x07, 0x06, 0x04, 0x04, 0x07, 0x01, + 0x01, 0x01, 0x04, 0x01, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, 0x06, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x01, 0x01, + 0x07, 0x06, 0x06, 0x07, 0x06, 0x07, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x04, + 0x01, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, +}; + +static unsigned char m911[256] = { + 0x40, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x40, 0x00, 0xf0, 0x00, 0x40, 0x80, 0x40, 0x40, + 0x40, 0xf0, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, 0x00, 0xc0, + 0x00, 0x40, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, + 0x70, 0x40, 0xf0, 0x00, 0x40, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x40, + 0x00, 0x00, 0xf0, 0x40, 0x70, 0x00, 0x70, 0x40, + 0x70, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0xf0, 0x70, 0x40, 0x70, 0x00, 0x40, + 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x70, 0x40, 0xf0, 0x00, 0xf0, + 0xf0, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x70, 0x40, 0x00, 0x40, 0x40, 0xf0, + 0x00, 0xf0, 0x40, 0xf0, 0x00, 0xf0, 0x40, 0x00, + 0x70, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x00, 0x70, + 0x40, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x00, + 0x00, 0x40, 0x70, 0x00, 0x70, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x70, 0xf0, 0xc0, 0x40, 0xc0, 0xf0, + 0x40, 0xc0, 0x40, 0x40, 0xf0, 0xf0, 0x40, 0x00, + 0x70, 0x00, 0x70, 0x40, 0x40, 0x40, 0x00, 0x40, + 0xf0, 0x70, 0x40, 0x40, 0x00, 0x40, 0x70, 0xf0, + 0x70, 0xf0, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0x00, 0x40, 0x40, 0x00, 0x70, 0xc0, + 0xf0, 0x40, 0x40, 0x70, 0xf0, 0xf0, 0x40, 0x70, + 0x00, 0x70, 0x00, 0xf0, 0x40, 0x40, 0x70, 0xf0, + 0x00, 0x40, 0xc0, 0x00, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x00, 0xf0, 0x70, 0x40, + 0x00, 0x40, 0x00, 0x40, 0x70, 0x40, 0x00, 0x70, +}; + +static unsigned char m912[256] = { + 0x06, 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x07, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x07, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x04, 0x07, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x06, 0x04, 0x07, 0x00, 0x04, 0x01, 0x01, 0x06, + 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x04, + 0x06, 0x07, 0x07, 0x04, 0x07, 0x04, 0x07, 0x07, + 0x05, 0x01, 0x07, 0x06, 0x07, 0x07, 0x05, 0x07, + 0x07, 0x07, 0x06, 0x04, 0x04, 0x01, 0x01, 0x01, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, + 0x04, 0x07, 0x06, 0x07, 0x05, 0x07, 0x04, 0x06, + 0x07, 0x07, 0x07, 0x06, 0x04, 0x04, 0x04, 0x00, + 0x04, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x07, 0x00, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x04, 0x06, + 0x00, 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x00, 0x07, 0x01, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x07, 0x00, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x07, 0x06, 0x04, 0x04, + 0x04, 0x00, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x00, 0x00, 0x00, 0x06, 0x04, 0x06, +}; + +static unsigned char m921[256] = { + 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x40, 0xf0, 0x70, 0x00, + 0xc0, 0xf0, 0xc0, 0x40, 0x70, 0x70, 0x40, 0x80, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x40, 0x70, 0x00, 0x00, 0x70, 0x00, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x40, 0xf0, 0x40, 0x40, 0x70, + 0x40, 0x40, 0xc0, 0x00, 0x40, 0x00, 0x40, 0xf0, + 0xc0, 0x00, 0x40, 0x40, 0x70, 0xf0, 0x40, 0x40, + 0x70, 0xf0, 0x40, 0x70, 0x00, 0x40, 0x40, 0x40, + 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x40, 0x40, 0x70, 0xf0, 0x40, 0x40, 0xf0, 0x00, + 0x40, 0x40, 0xf0, 0x00, 0xf0, 0xc0, 0xf0, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x40, 0x70, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x70, 0x40, + 0xf0, 0x00, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0xf0, 0x40, 0xf0, 0x00, 0x70, 0xf0, 0x40, + 0xf0, 0x40, 0x70, 0x70, 0xf0, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x40, 0x00, 0x70, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0xc0, 0xf0, + 0x40, 0xf0, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x40, 0xc0, 0x40, 0x40, 0xf0, + 0x40, 0x00, 0xf0, 0x40, 0x00, 0x40, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x40, 0xf0, 0x40, 0x00, 0x40, + 0x40, 0x70, 0xf0, 0x00, 0x40, 0x70, 0x40, 0x00, + 0x40, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x40, 0x70, 0x40, 0xf0, 0x00, 0x00, 0x40, +}; + +static unsigned char m922[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x00, 0x06, 0x04, 0x05, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x05, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, +}; + +static unsigned char m931[256] = { + 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x70, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x70, + 0xf0, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, + 0xf0, 0x70, 0xf0, 0x00, 0x40, 0x40, 0xc0, 0xc0, + 0xf0, 0xc0, 0xf0, 0x70, 0xc0, 0x40, 0xf0, 0x40, + 0xf0, 0x40, 0x40, 0xf0, 0x70, 0x00, 0xf0, 0xf0, + 0x00, 0x00, 0x70, 0x40, 0x40, 0x70, 0x40, 0x40, + 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, + 0xc0, 0x40, 0x80, 0xf0, 0x00, 0xf0, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x00, 0xf0, 0x40, 0x70, 0x40, + 0x40, 0x00, 0x40, 0xf0, 0x70, 0x00, 0x40, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x70, 0x40, 0xf0, 0x40, + 0x40, 0x40, 0x00, 0x40, 0x40, 0xf0, 0x40, 0x00, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0x40, 0xf0, 0x40, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x40, 0x40, 0xf0, 0x40, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x00, 0xf0, 0x40, 0xf0, 0x70, + 0x40, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x40, 0x00, 0xc0, 0x40, 0x00, 0x40, 0xf0, + 0x40, 0x40, 0x00, 0x40, 0xf0, 0xf0, 0x70, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, + 0x00, 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0xf0, 0x40, 0x40, 0x40, 0x40, + 0x70, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, + 0x70, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x70, 0x70, + 0x70, 0x40, 0x00, 0x00, 0x40, 0x70, 0xc0, 0x40, + 0x00, 0xf0, 0x40, 0x00, 0xf0, 0x70, 0x40, 0x40, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, +}; + +static unsigned char m932[256] = { + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x01, 0x04, + 0x04, 0x00, 0x04, 0x04, 0x00, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x07, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x04, 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x00, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m941[256] = { + 0x00, 0x40, 0x40, 0x70, 0xc0, 0x00, 0x00, 0x70, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x70, 0x00, 0x00, 0x70, 0x70, 0x40, 0x40, 0x40, + 0xf0, 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x40, 0xf0, 0x70, 0x00, + 0xf0, 0x00, 0x70, 0x40, 0x00, 0x40, 0x00, 0x40, + 0x00, 0x70, 0x00, 0x40, 0xf0, 0x40, 0x00, 0x00, + 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0x70, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x70, 0xf0, 0x40, 0x00, 0x70, 0x40, + 0x70, 0x40, 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x70, 0x40, 0x00, 0x40, 0x40, 0x40, + 0x70, 0x40, 0x40, 0x00, 0x00, 0x70, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x00, 0x70, 0xf0, 0x70, 0xf0, + 0x00, 0x70, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m942[256] = { + 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x06, 0x00, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, + 0x06, 0x00, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x04, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, +}; + +static unsigned char m951[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0xf0, 0x00, 0x70, 0xf0, 0x40, 0x00, 0x00, 0x70, + 0x40, 0xf0, 0x70, 0xf0, 0x40, 0x40, 0x40, 0xf0, + 0x00, 0xf0, 0x80, 0xf0, 0xf0, 0x00, 0x70, 0x00, + 0xf0, 0x70, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x70, 0x40, 0x70, 0xf0, 0xf0, 0xf0, 0x40, 0x70, + 0xf0, 0x40, 0x00, 0x40, 0x40, 0xf0, 0x00, 0x00, + 0x00, 0x80, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, + 0x00, 0x70, 0x40, 0xf0, 0xf0, 0x40, 0x70, 0x40, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x40, 0xf0, + 0x40, 0x40, 0xf0, 0x40, 0x70, 0x70, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x40, 0xf0, 0xf0, 0xf0, 0x00, + 0x70, 0x40, 0x40, 0x00, 0xf0, 0x40, 0x40, 0x40, + 0x40, 0xf0, 0xf0, 0x00, 0x40, 0x70, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m952[256] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x01, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x05, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, +}; + +static unsigned char m961[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x00, + 0x00, 0xf0, 0x40, 0x00, 0x40, 0x40, 0x40, 0x00, + 0x70, 0x00, 0xf0, 0x00, 0x40, 0x00, 0xf0, 0x70, + 0x00, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x40, 0x40, 0xf0, 0x40, 0x40, 0x00, 0xf0, + 0xf0, 0x40, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0x00, 0x70, + 0xf0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x40, + 0x40, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0x00, 0x40, 0xf0, 0xf0, 0xf0, 0x70, 0x70, 0x00, + 0x00, 0x00, 0xf0, 0x00, 0x70, 0x00, 0x40, 0x00, + 0xf0, 0x00, 0x70, 0xf0, 0x40, 0xf0, 0xf0, 0xf0, + 0xf0, 0x00, 0x70, 0x40, 0x40, 0xf0, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x40, 0xf0, 0xf0, 0x00, + 0x70, 0x40, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x70, + 0x00, 0x40, 0x00, 0x00, 0xf0, 0xf0, 0x40, 0x70, + 0xf0, 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0x00, 0x40, + 0x70, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x40, 0xf0, + 0xf0, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x70, 0xf0, 0x70, 0x40, 0x70, 0x00, 0x70, 0xf0, + 0x70, 0x70, 0x40, 0xf0, 0x70, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, + 0x00, 0xf0, 0x40, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, + 0x00, 0x70, 0x40, 0x00, 0x00, 0xf0, 0xf0, 0x00, + 0x40, 0xf0, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0x40, + 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xc0, 0xf0, 0x70, 0x00, 0x00, 0x00, 0xc0, + 0xf0, 0x40, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0xf0, + 0x00, 0xf0, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m962[256] = { + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x07, 0x05, 0x06, 0x01, + 0x06, 0x07, 0x07, 0x06, 0x06, 0x04, 0x04, 0x04, + 0x06, 0x04, 0x07, 0x04, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x07, 0x07, 0x05, 0x05, 0x01, 0x01, 0x04, + 0x04, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, 0x07, + 0x07, 0x04, 0x07, 0x06, 0x07, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, + 0x07, 0x06, 0x04, 0x06, 0x07, 0x05, 0x04, 0x04, + 0x06, 0x04, 0x04, 0x07, 0x06, 0x06, 0x06, 0x07, + 0x04, 0x07, 0x07, 0x06, 0x07, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x07, 0x06, 0x07, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x04, 0x00, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x07, 0x07, 0x06, + 0x07, 0x06, 0x06, 0x07, 0x04, 0x07, 0x06, 0x05, + 0x01, 0x06, 0x06, 0x06, 0x07, 0x06, 0x04, 0x07, + 0x07, 0x07, 0x04, 0x06, 0x07, 0x04, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x07, 0x06, 0x04, 0x07, 0x06, 0x04, 0x05, 0x04, + 0x06, 0x07, 0x04, 0x06, 0x07, 0x05, 0x05, 0x06, + 0x07, 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, + 0x04, 0x04, 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x01, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, + 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, 0x04, 0x07, + 0x06, 0x06, 0x06, 0x01, 0x04, 0x06, 0x07, 0x07, + 0x06, 0x07, 0x06, 0x06, 0x04, 0x06, 0x01, 0x06, +}; + +static unsigned char m971[256] = { + 0xf0, 0x00, 0x40, 0x40, 0x70, 0x40, 0xf0, 0xf0, + 0x70, 0x40, 0x70, 0x00, 0x00, 0x70, 0x70, 0x70, + 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0xf0, 0x40, 0x40, 0xf0, 0x40, 0xf0, 0x00, + 0x00, 0x40, 0x40, 0x40, 0x70, 0x00, 0x00, 0xf0, + 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x40, 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x70, 0x00, + 0x00, 0x40, 0xf0, 0x40, 0xf0, 0x00, 0x70, 0x00, + 0xf0, 0x70, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x80, 0x70, 0x00, 0x00, 0x40, 0xf0, 0x40, + 0x40, 0x70, 0x40, 0x40, 0xf0, 0x00, 0xf0, 0x00, + 0x70, 0xf0, 0xf0, 0x40, 0x70, 0x00, 0x70, 0x40, + 0x70, 0xf0, 0x40, 0x70, 0x00, 0xf0, 0x40, 0x00, + 0x00, 0x70, 0x00, 0x40, 0xf0, 0x00, 0x40, 0xc0, + 0x40, 0x70, 0xf0, 0x40, 0x70, 0x40, 0x00, 0x40, + 0x40, 0x70, 0x00, 0x00, 0x70, 0x70, 0x70, 0x00, + 0x00, 0x40, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x70, 0x40, 0x40, 0x00, 0x70, 0x00, 0x40, 0x40, + 0xf0, 0x00, 0x40, 0x70, 0x00, 0x00, 0x70, 0x00, + 0xf0, 0x00, 0x00, 0xf0, 0x40, 0xf0, 0x40, 0x00, + 0x00, 0x40, 0x40, 0x70, 0x70, 0x40, 0x40, 0x00, + 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x40, 0x40, + 0x00, 0x40, 0x00, 0x70, 0x40, 0x40, 0xf0, 0x40, + 0x70, 0x40, 0x40, 0xf0, 0x40, 0x40, 0x40, 0x00, + 0x40, 0x40, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x40, 0xf0, 0x40, 0x40, 0x00, + 0x40, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x40, + 0x00, 0x40, 0x70, 0xf0, 0x40, 0x70, 0xf0, 0x40, + 0x40, 0x00, 0x40, 0xf0, 0x00, 0x00, 0x00, 0xf0, +}; + +static unsigned char m972[256] = { + 0x07, 0x01, 0x06, 0x04, 0x07, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x06, 0x04, 0x07, 0x07, 0x07, + 0x06, 0x06, 0x06, 0x07, 0x04, 0x04, 0x07, 0x04, + 0x06, 0x06, 0x04, 0x04, 0x07, 0x06, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x07, 0x06, 0x06, 0x01, 0x06, 0x06, + 0x07, 0x04, 0x07, 0x04, 0x04, 0x06, 0x04, 0x04, + 0x07, 0x07, 0x06, 0x04, 0x04, 0x06, 0x07, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x00, 0x04, 0x00, 0x00, + 0x04, 0x04, 0x07, 0x01, 0x00, 0x04, 0x07, 0x04, + 0x06, 0x05, 0x06, 0x07, 0x06, 0x04, 0x07, 0x04, + 0x07, 0x07, 0x07, 0x04, 0x04, 0x01, 0x06, 0x04, + 0x06, 0x07, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x00, 0x06, 0x07, 0x07, 0x04, 0x07, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x00, 0x04, + 0x06, 0x04, 0x06, 0x07, 0x04, 0x07, 0x06, 0x06, + 0x00, 0x01, 0x01, 0x04, 0x07, 0x04, 0x04, 0x06, + 0x07, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, + 0x04, 0x04, 0x05, 0x06, 0x05, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x07, 0x04, 0x04, + 0x06, 0x06, 0x04, 0x07, 0x04, 0x05, 0x07, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, +}; + +static unsigned char m981[256] = { + 0x80, 0xf0, 0xf0, 0xf0, 0x00, 0xf0, 0xf0, 0x40, + 0xf0, 0x00, 0xc0, 0x00, 0xf0, 0x40, 0x40, 0x70, + 0xf0, 0xf0, 0xf0, 0xf0, 0x40, 0x00, 0x40, 0xf0, + 0xf0, 0x40, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, + 0x40, 0x70, 0x00, 0x40, 0x70, 0x40, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x70, 0xf0, 0x40, 0x40, + 0xc0, 0x00, 0x40, 0x40, 0x70, 0x40, 0x00, 0x70, + 0xf0, 0x80, 0x00, 0xf0, 0x70, 0x70, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x40, + 0x00, 0x00, 0x40, 0x70, 0xf0, 0xf0, 0xf0, 0x70, + 0x00, 0x40, 0x40, 0x40, 0xf0, 0x70, 0x40, 0x40, + 0xf0, 0x40, 0xc0, 0x70, 0x00, 0x00, 0xf0, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x00, 0xc0, 0x40, 0xf0, + 0x00, 0x00, 0x40, 0xf0, 0x40, 0x00, 0x00, 0xf0, + 0x70, 0x70, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x70, 0x40, 0x00, 0x40, 0x40, 0xf0, + 0x40, 0xf0, 0x00, 0x00, 0x40, 0x00, 0x70, 0x40, + 0x40, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x70, 0xf0, 0x40, 0x70, 0x80, + 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, + 0x00, 0xc0, 0xf0, 0x40, 0x00, 0x40, 0x40, 0x40, + 0x00, 0x70, 0x40, 0x70, 0x00, 0xf0, 0xf0, 0xf0, + 0x00, 0x00, 0x70, 0x40, 0xf0, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0x00, +}; + +static unsigned char m982[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x00, 0x06, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x00, 0x04, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x00, 0x06, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x01, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x06, 0x04, 0x04, 0x01, 0x07, + 0x00, 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, 0x07, + 0x01, 0x06, 0x06, 0x06, 0x04, 0x06, 0x00, 0x06, + 0x04, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, +}; + +static unsigned char m991[256] = { + 0x00, 0x00, 0x40, 0xf0, 0x00, 0x70, 0x00, 0x40, + 0x40, 0xf0, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0xf0, 0x40, 0x70, 0xf0, 0x70, 0x40, 0x40, 0x40, + 0xf0, 0x00, 0x40, 0x40, 0x40, 0x70, 0xf0, 0x40, + 0xf0, 0x70, 0x40, 0x00, 0x70, 0x00, 0x40, 0x40, + 0xf0, 0x00, 0x00, 0x40, 0x70, 0x00, 0x70, 0x00, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x40, 0x40, 0x40, 0x70, 0x70, 0x00, + 0x40, 0x40, 0x70, 0x00, 0x00, 0xf0, 0x40, 0x40, + 0x40, 0xf0, 0x00, 0xf0, 0xf0, 0xc0, 0x40, 0x00, + 0x70, 0xf0, 0xf0, 0x00, 0xc0, 0x70, 0x00, 0xf0, + 0x40, 0x40, 0x00, 0x40, 0x40, 0x00, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x70, + 0x70, 0xf0, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0x00, + 0x40, 0xc0, 0x40, 0xf0, 0xf0, 0x40, 0x00, 0x00, + 0x00, 0xc0, 0x40, 0x00, 0x70, 0x40, 0x00, 0x40, + 0x00, 0xf0, 0x00, 0x40, 0x70, 0x70, 0x70, 0x00, + 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xf0, 0x40, 0x40, 0xf0, 0x00, 0x00, + 0x70, 0xc0, 0x40, 0x70, 0x40, 0xf0, 0x40, 0xf0, + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x40, 0x40, 0xf0, 0x70, 0x00, + 0x40, 0xf0, 0x70, 0x00, 0x40, 0x40, 0x00, 0x00, + 0x70, 0x40, 0x00, 0x70, 0x00, 0x40, 0x40, 0xf0, +}; + +static unsigned char m992[256] = { + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x01, 0x04, 0x00, + 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, + 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x07, + 0x07, 0x07, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x06, 0x06, + 0x07, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x00, 0x04, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x00, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, +}; + +static unsigned char m9a1[256] = { + 0x00, 0xf0, 0x40, 0x40, 0x40, 0x70, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x40, 0x40, 0x00, 0xf0, 0xf0, + 0x40, 0x40, 0x70, 0x70, 0x00, 0x00, 0x40, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, + 0x70, 0x00, 0x00, 0xf0, 0x00, 0x40, 0x40, 0x00, + 0xf0, 0x00, 0x00, 0x40, 0x00, 0x40, 0xc0, 0xf0, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, + 0xf0, 0x40, 0x70, 0xf0, 0x40, 0xf0, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x40, 0x40, 0xf0, 0x40, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x40, 0xf0, 0x40, 0xf0, + 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x40, 0x00, 0xf0, + 0x00, 0x00, 0xf0, 0x00, 0x70, 0xf0, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x40, 0x00, 0x40, 0x70, 0x40, 0x40, + 0x70, 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x00, + 0xf0, 0x40, 0x00, 0x40, 0x70, 0x00, 0x40, 0x40, + 0x70, 0x40, 0x00, 0x40, 0x70, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, + 0x40, 0x70, 0x40, 0xf0, 0xf0, 0x40, 0x40, 0x40, + 0xf0, 0x00, 0x00, 0x40, 0x40, 0x00, 0x70, 0x70, + 0x40, 0x00, 0x70, 0x70, 0x40, 0xc0, 0x70, 0x40, + 0x00, 0x40, 0x70, 0x70, 0x40, 0x70, 0xf0, 0x70, + 0x00, 0x70, 0x40, 0x40, 0x70, 0x40, 0x00, 0x70, + 0x00, 0x40, 0x40, 0x70, 0x00, 0x40, 0x00, 0x40, +}; + +static unsigned char m9a2[256] = { + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, + 0x07, 0x04, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x07, 0x07, 0x04, 0x06, 0x06, 0x04, 0x05, 0x07, + 0x07, 0x06, 0x05, 0x06, 0x07, 0x04, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x04, 0x04, 0x01, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x01, 0x01, 0x06, 0x04, 0x06, + 0x06, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x04, 0x04, 0x04, 0x06, 0x04, 0x04, 0x07, + 0x04, 0x07, 0x04, 0x06, 0x04, 0x04, 0x07, 0x06, + 0x04, 0x04, 0x04, 0x07, 0x06, 0x07, 0x06, 0x07, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, +}; + +static unsigned char m9b1[256] = { + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x70, 0x00, + 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x70, 0x40, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x70, + 0x40, 0x00, 0x70, 0x70, 0x00, 0x70, 0x40, 0xf0, + 0x70, 0x70, 0xf0, 0x40, 0x00, 0x40, 0x70, 0x70, + 0x00, 0xf0, 0x70, 0x40, 0x40, 0x40, 0x00, 0x40, + 0x00, 0x40, 0x40, 0x70, 0xf0, 0x40, 0x00, 0x00, + 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x40, 0x40, 0x70, 0x70, 0xf0, + 0x00, 0x70, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x40, + 0x70, 0x00, 0xf0, 0x40, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x40, 0x00, + 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0xf0, + 0x00, 0x00, 0x00, 0x40, 0x70, 0x40, 0x00, 0x40, + 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x00, 0x70, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x00, 0x40, 0xf0, 0x40, + 0x40, 0xf0, 0x70, 0x70, 0x40, 0x00, 0x70, 0x70, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0xf0, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x70, 0x40, 0x70, 0xf0, 0x40, 0x70, 0xf0, 0x00, + 0x40, 0x40, 0x40, 0x00, 0x70, 0x00, 0x00, 0x40, + 0x40, 0x70, 0x00, 0x40, 0x40, 0x00, 0x40, 0x40, + 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x70, 0x40, + 0x40, 0xf0, 0x70, 0x00, 0x00, 0x00, 0x40, 0x70, + 0x40, 0x70, 0x70, 0x00, 0x70, 0x00, 0xf0, 0x40, + 0x40, 0x00, 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, + 0x00, 0x70, 0x70, 0x70, 0xf0, 0x40, 0x00, 0x40, + 0xf0, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, + 0x70, 0x70, 0x70, 0x40, 0x00, 0x70, 0x00, 0x40, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, 0x00, 0x40, +}; + +static unsigned char m9b2[256] = { + 0x04, 0x06, 0x04, 0x07, 0x06, 0x06, 0x06, 0x04, + 0x07, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, + 0x06, 0x06, 0x06, 0x01, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x07, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, 0x07, + 0x04, 0x06, 0x07, 0x06, 0x04, 0x06, 0x00, 0x06, + 0x04, 0x04, 0x06, 0x07, 0x07, 0x04, 0x06, 0x06, + 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x01, + 0x07, 0x05, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, + 0x04, 0x07, 0x06, 0x04, 0x07, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x00, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x00, + 0x04, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x00, 0x04, 0x00, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x00, 0x04, + 0x00, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, + 0x06, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, 0x06, + 0x06, 0x04, 0x04, 0x04, 0x04, 0x06, 0x04, 0x04, +}; + +static unsigned char m9c1[256] = { + 0x40, 0x00, 0x40, 0x00, 0x70, 0x00, 0x70, 0x00, + 0x70, 0x70, 0x70, 0x40, 0x70, 0xf0, 0x00, 0x40, + 0xf0, 0x40, 0xf0, 0x70, 0x70, 0xf0, 0x40, 0x00, + 0x40, 0x40, 0x40, 0x70, 0x40, 0x00, 0x40, 0x00, + 0x00, 0x70, 0x40, 0x40, 0x70, 0xf0, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x70, 0x70, 0x70, + 0x70, 0x40, 0xf0, 0x00, 0x00, 0x40, 0x40, 0x40, + 0x00, 0x70, 0x70, 0xf0, 0x00, 0x40, 0x70, 0x00, + 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x70, 0xf0, + 0x70, 0xc0, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x40, 0x00, 0x70, 0x40, 0x40, 0x00, 0x40, 0xf0, + 0x40, 0x00, 0x70, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x70, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x70, + 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x40, 0x00, 0x00, 0x40, 0x70, 0x40, + 0x70, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, 0xf0, + 0x00, 0xf0, 0x00, 0x70, 0x70, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x40, 0xf0, 0xf0, 0x00, 0xf0, 0x40, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m9c2[256] = { + 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x00, 0x00, 0x00, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x00, 0x00, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x00, 0x00, 0x00, 0x04, 0x06, 0x06, 0x04, + 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, +}; + +static unsigned char m9d1[256] = { + 0x00, 0x00, 0x40, 0x70, 0x00, 0x00, 0x70, 0x70, + 0x70, 0xf0, 0x00, 0x40, 0x00, 0x00, 0x70, 0x00, + 0x00, 0x40, 0x70, 0x00, 0x00, 0x70, 0x00, 0x40, + 0x40, 0x00, 0x00, 0xf0, 0x40, 0x40, 0x40, 0x70, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xf0, 0x00, + 0xf0, 0x00, 0x70, 0x70, 0x70, 0x00, 0x00, 0x40, + 0x40, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0xf0, 0x40, 0x40, 0x70, 0x70, + 0x00, 0x70, 0x40, 0x40, 0x70, 0x40, 0x70, 0x40, + 0x70, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xf0, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x70, 0xf0, 0x70, 0x40, + 0xf0, 0xf0, 0x40, 0x40, 0x70, 0x40, 0x00, 0x00, + 0x00, 0x40, 0x40, 0x40, 0xf0, 0x00, 0x00, 0x70, + 0x40, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x00, 0x70, 0x40, 0x40, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, 0x70, + 0x00, 0x70, 0x40, 0x00, 0x00, 0x40, 0x40, 0x70, + 0x00, 0x00, 0x40, 0x40, 0x00, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x40, 0x70, 0x40, 0x00, 0x40, 0xf0, + 0x00, 0x40, 0x70, 0x00, 0xf0, 0x40, 0x00, 0x00, + 0x70, 0x40, 0x70, 0x70, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x70, 0x70, 0x40, 0xf0, 0x00, 0x70, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x70, 0x40, 0x40, 0x40, 0xc0, + 0x00, 0x70, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, 0x40, + 0x00, 0x40, 0x00, 0x40, 0x00, 0x70, 0x40, 0x70, + 0x40, 0x00, 0xf0, 0x40, 0x40, 0x00, 0x00, 0x00, + 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x70, 0x40, 0x00, +}; + +static unsigned char m9d2[256] = { + 0x06, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x00, 0x00, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x04, 0x06, 0x06, + 0x06, 0x04, 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x00, 0x04, + 0x00, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x04, 0x04, 0x00, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, + 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x00, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, +}; + +static unsigned char m9e1[256] = { + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, + 0x00, 0x40, 0xf0, 0x70, 0x40, 0x40, 0xf0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, + 0x70, 0xf0, 0x40, 0x40, 0x40, 0xf0, 0x00, 0xf0, + 0x40, 0x70, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, + 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x40, 0x40, + 0x00, 0x70, 0xf0, 0xf0, 0x00, 0x70, 0x40, 0xf0, + 0x40, 0x00, 0x00, 0x40, 0x00, 0xf0, 0x40, 0xf0, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xf0, 0x70, 0x00, + 0x40, 0x70, 0x70, 0x00, 0x40, 0x70, 0x40, 0x40, + 0x40, 0x00, 0x00, 0x40, 0xc0, 0xc0, 0x00, 0x00, + 0x70, 0x70, 0x70, 0xf0, 0x70, 0x00, 0xf0, 0x70, + 0x00, 0x00, 0x00, 0x80, 0x70, 0x00, 0x40, 0x00, + 0x40, 0x00, 0x00, 0x40, 0x70, 0xf0, 0xf0, 0x70, + 0x70, 0x80, 0x70, 0x00, 0xf0, 0x40, 0x00, 0x00, + 0xf0, 0x70, 0x00, 0xf0, 0xf0, 0x70, 0xf0, 0x40, + 0x70, 0x00, 0x00, 0x00, 0x40, 0x70, 0x00, 0x40, + 0xf0, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x70, + 0x40, 0x40, 0x40, 0x00, 0xf0, 0x40, 0x70, 0x70, + 0x40, 0x70, 0x00, 0x70, 0x70, 0x70, 0x00, 0x40, +}; + +static unsigned char m9e2[256] = { + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, + 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x06, 0x04, 0x04, + 0x00, 0x06, 0x06, 0x04, 0x06, 0x06, 0x01, 0x07, + 0x06, 0x04, 0x07, 0x06, 0x04, 0x04, 0x06, 0x07, + 0x07, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, + 0x04, 0x06, 0x07, 0x07, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x06, 0x06, 0x06, 0x06, 0x07, 0x04, 0x07, + 0x06, 0x06, 0x04, 0x04, 0x06, 0x06, 0x05, 0x06, + 0x04, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x04, + 0x06, 0x04, 0x04, 0x04, 0x07, 0x06, 0x06, 0x06, + 0x01, 0x00, 0x00, 0x07, 0x06, 0x05, 0x07, 0x04, + 0x06, 0x04, 0x06, 0x06, 0x05, 0x04, 0x04, 0x04, + 0x06, 0x01, 0x04, 0x04, 0x06, 0x07, 0x07, 0x07, + 0x06, 0x07, 0x04, 0x06, 0x07, 0x06, 0x06, 0x04, + 0x07, 0x04, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, + 0x07, 0x00, 0x05, 0x04, 0x06, 0x07, 0x06, 0x07, + 0x06, 0x01, 0x01, 0x06, 0x04, 0x06, 0x06, 0x07, + 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x07, 0x06, 0x07, 0x07, 0x06, 0x05, 0x06, +}; + +static unsigned char m9f1[256] = { + 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0xf0, + 0xf0, 0x40, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x40, + 0x40, 0x40, 0x40, 0xf0, 0x40, 0x70, 0x40, 0x40, + 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, + 0xf0, 0x70, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x40, 0x40, 0x70, 0x00, 0x00, 0x40, + 0x00, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, 0x40, + 0x00, 0x40, 0x40, 0xf0, 0x40, 0x40, 0x70, 0x40, + 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xf0, 0x70, + 0x00, 0x00, 0xf0, 0x40, 0x70, 0x40, 0x40, 0x40, + 0x40, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0xf0, + 0x70, 0xf0, 0x70, 0x70, 0x00, 0x00, 0x70, 0xf0, + 0x40, 0x40, 0xf0, 0x00, 0xf0, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x70, 0x40, 0x00, 0x40, 0x70, 0xf0, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x40, + 0xc0, 0x40, 0x40, 0x00, 0x40, 0xf0, 0x40, 0x40, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x70, 0x40, 0x00, + 0x70, 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char m9f2[256] = { + 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, + 0x04, 0x06, 0x06, 0x01, 0x00, 0x01, 0x07, 0x06, + 0x07, 0x04, 0x06, 0x07, 0x04, 0x06, 0x06, 0x05, + 0x06, 0x07, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, + 0x07, 0x00, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x07, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, + 0x06, 0x05, 0x04, 0x07, 0x04, 0x07, 0x07, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x05, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x05, 0x01, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x01, + 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x04, 0x04, + 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x04, + 0x06, 0x05, 0x01, 0x01, 0x06, 0x04, 0x04, 0x01, + 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mac1[256] = { + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, +}; + +static unsigned char mad1[256] = { + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, +}; + +static unsigned char mae1[256] = { + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +}; + +static unsigned char maf1[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mb01[256] = { + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mb11[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, +}; + +static unsigned char mb21[256] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, +}; + +static unsigned char mb31[256] = { + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +}; + +static unsigned char mb41[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mb51[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mb61[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mb71[256] = { + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, +}; + +static unsigned char mb81[256] = { + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, +}; + +static unsigned char mb91[256] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mba1[256] = { + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +}; + +static unsigned char mbb1[256] = { + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, +}; + +static unsigned char mbc1[256] = { + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +}; + +static unsigned char mbd1[256] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mbe1[256] = { + 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mbf1[256] = { + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mc01[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mc11[256] = { + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, +}; + +static unsigned char mc21[256] = { + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, +}; + +static unsigned char mc31[256] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mc41[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, +}; + +static unsigned char mc51[256] = { + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, +}; + +static unsigned char mc61[256] = { + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +}; + +static unsigned char mc71[256] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mc81[256] = { + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, +}; + +static unsigned char mc91[256] = { + 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, + 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +}; + +static unsigned char mca1[256] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mcb1[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mcc1[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mcd1[256] = { + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, +}; + +static unsigned char mce1[256] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mcf1[256] = { + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +}; + +static unsigned char md01[256] = { + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char md11[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char md21[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char md31[256] = { + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, +}; + +static unsigned char md41[256] = { + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, +}; + +static unsigned char md51[256] = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char md61[256] = { + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, +}; + +static unsigned char md71[256] = { + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, + 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mf62[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +}; + +static unsigned char mf72[256] = { + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, +}; + +static unsigned char mf82[256] = { + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mf91[256] = { + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, +}; + +static unsigned char mfa1[256] = { + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mfa2[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mfe2[256] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x06, 0x04, 0x02, 0x02, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x02, + 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mff1[256] = { + 0x00, 0xf0, 0x80, 0xf0, 0xf0, 0xf0, 0xf0, 0x80, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x80, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, + 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xc0, 0x00, + 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xa0, 0xa0, 0xf0, 0x00, 0xf0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static unsigned char mff2[256] = { + 0x00, 0x07, 0x01, 0x07, 0x07, 0x07, 0x07, 0x01, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x01, 0x07, 0x01, 0x01, 0x07, + 0x01, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x07, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static const struct { + unsigned char *bits0; + unsigned char *bits1; + unsigned char *bits2; +} charmap[256] = { + { m000, m001, m002, }, { m010, m011, m012, }, { m020, m021, m022, }, { m030, m031, m032, }, + { m040, m041, m042, }, { m050, m051, m052, }, { m060, m061, m062, }, { NULL, m071, m072, }, + { NULL, m081, m082, }, { NULL, m091, m092, }, { NULL, m0a1, m0a2, }, { NULL, m0b1, m0b2, }, + { NULL, m0c1, m0c2, }, { NULL, m0d1, m0d2, }, { NULL, m0e1, m0e2, }, { NULL, m0f1, m0f2, }, + { NULL, m101, m102, }, { NULL, m111, m112, }, { NULL, m121, m122, }, { NULL, m131, m132, }, + { NULL, m141, m142, }, { NULL, m151, m152, }, { NULL, m161, m162, }, { NULL, m171, m172, }, + { NULL, m181, m182, }, { NULL, m191, m192, }, { NULL, m1a1, m1a2, }, { NULL, m1b1, m1b2, }, + { NULL, m1c1, m1c2, }, { NULL, m1d1, m1d2, }, { NULL, m1e1, m1e2, }, { NULL, m1f1, m1f2, }, + { m200, m201, m202, }, { m210, m211, m212, }, { m220, m221, m222, }, { m230, m231, m232, }, + { NULL, m241, m242, }, { m250, m251, m252, }, { NULL, m261, m262, }, { NULL, m271, m272, }, + { NULL, m281, m282, }, { NULL, m291, m292, }, { NULL, m2a1, m2a2, }, { NULL, m2b1, m2b2, }, + { NULL, m2c1, m2c2, }, { NULL, m2d1, m2d2, }, { NULL, m2e1, m2e2, }, { NULL, m2f1, m2f2, }, + { NULL, m301, m302, }, { NULL, m311, m312, }, { NULL, m321, m322, }, { NULL, m331, m332, }, + { NULL, NULL, m342, }, { NULL, NULL, m352, }, { NULL, NULL, m362, }, { NULL, NULL, m372, }, + { NULL, NULL, m382, }, { NULL, NULL, m392, }, { NULL, NULL, m3a2, }, { NULL, NULL, m3b2, }, + { NULL, NULL, m3c2, }, { NULL, NULL, m3d2, }, { NULL, NULL, m3e2, }, { NULL, NULL, m3f2, }, + { NULL, NULL, m402, }, { NULL, NULL, m412, }, { NULL, NULL, m422, }, { NULL, NULL, m432, }, + { NULL, NULL, m442, }, { NULL, NULL, m452, }, { NULL, NULL, m462, }, { NULL, NULL, m472, }, + { NULL, NULL, m482, }, { NULL, NULL, m492, }, { NULL, NULL, m4a2, }, { NULL, NULL, m4b2, }, + { NULL, NULL, m4c2, }, { NULL, NULL, m4d2, }, { NULL, m4e1, m4e2, }, { NULL, m4f1, m4f2, }, + { NULL, m501, m502, }, { NULL, m511, m512, }, { NULL, m521, m522, }, { NULL, m531, m532, }, + { NULL, m541, m542, }, { NULL, m551, m552, }, { NULL, m561, m562, }, { NULL, m571, m572, }, + { NULL, m581, m582, }, { NULL, m591, m592, }, { NULL, m5a1, m5a2, }, { NULL, m5b1, m5b2, }, + { NULL, m5c1, m5c2, }, { NULL, m5d1, m5d2, }, { NULL, m5e1, m5e2, }, { NULL, m5f1, m5f2, }, + { NULL, m601, m602, }, { NULL, m611, m612, }, { NULL, m621, m622, }, { NULL, m631, m632, }, + { NULL, m641, m642, }, { NULL, m651, m652, }, { NULL, m661, m662, }, { NULL, m671, m672, }, + { NULL, m681, m682, }, { NULL, m691, m692, }, { NULL, m6a1, m6a2, }, { NULL, m6b1, m6b2, }, + { NULL, m6c1, m6c2, }, { NULL, m6d1, m6d2, }, { NULL, m6e1, m6e2, }, { NULL, m6f1, m6f2, }, + { NULL, m701, m702, }, { NULL, m711, m712, }, { NULL, m721, m722, }, { NULL, m731, m732, }, + { NULL, m741, m742, }, { NULL, m751, m752, }, { NULL, m761, m762, }, { NULL, m771, m772, }, + { NULL, m781, m782, }, { NULL, m791, m792, }, { NULL, m7a1, m7a2, }, { NULL, m7b1, m7b2, }, + { NULL, m7c1, m7c2, }, { NULL, m7d1, m7d2, }, { NULL, m7e1, m7e2, }, { NULL, m7f1, m7f2, }, + { NULL, m801, m802, }, { NULL, m811, m812, }, { NULL, m821, m822, }, { NULL, m831, m832, }, + { NULL, m841, m842, }, { NULL, m851, m852, }, { NULL, m861, m862, }, { NULL, m871, m872, }, + { NULL, m881, m882, }, { NULL, m891, m892, }, { NULL, m8a1, m8a2, }, { NULL, m8b1, m8b2, }, + { NULL, m8c1, m8c2, }, { NULL, m8d1, m8d2, }, { NULL, m8e1, m8e2, }, { NULL, m8f1, m8f2, }, + { NULL, m901, m902, }, { NULL, m911, m912, }, { NULL, m921, m922, }, { NULL, m931, m932, }, + { NULL, m941, m942, }, { NULL, m951, m952, }, { NULL, m961, m962, }, { NULL, m971, m972, }, + { NULL, m981, m982, }, { NULL, m991, m992, }, { NULL, m9a1, m9a2, }, { NULL, m9b1, m9b2, }, + { NULL, m9c1, m9c2, }, { NULL, m9d1, m9d2, }, { NULL, m9e1, m9e2, }, { NULL, m9f1, m9f2, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, mac1, NULL, }, { NULL, mad1, NULL, }, { NULL, mae1, NULL, }, { NULL, maf1, NULL, }, + { NULL, mb01, NULL, }, { NULL, mb11, NULL, }, { NULL, mb21, NULL, }, { NULL, mb31, NULL, }, + { NULL, mb41, NULL, }, { NULL, mb51, NULL, }, { NULL, mb61, NULL, }, { NULL, mb71, NULL, }, + { NULL, mb81, NULL, }, { NULL, mb91, NULL, }, { NULL, mba1, NULL, }, { NULL, mbb1, NULL, }, + { NULL, mbc1, NULL, }, { NULL, mbd1, NULL, }, { NULL, mbe1, NULL, }, { NULL, mbf1, NULL, }, + { NULL, mc01, NULL, }, { NULL, mc11, NULL, }, { NULL, mc21, NULL, }, { NULL, mc31, NULL, }, + { NULL, mc41, NULL, }, { NULL, mc51, NULL, }, { NULL, mc61, NULL, }, { NULL, mc71, NULL, }, + { NULL, mc81, NULL, }, { NULL, mc91, NULL, }, { NULL, mca1, NULL, }, { NULL, mcb1, NULL, }, + { NULL, mcc1, NULL, }, { NULL, mcd1, NULL, }, { NULL, mce1, NULL, }, { NULL, mcf1, NULL, }, + { NULL, md01, NULL, }, { NULL, md11, NULL, }, { NULL, md21, NULL, }, { NULL, md31, NULL, }, + { NULL, md41, NULL, }, { NULL, md51, NULL, }, { NULL, md61, NULL, }, { NULL, md71, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, mf62, }, { NULL, NULL, mf72, }, + { NULL, NULL, mf82, }, { NULL, mf91, NULL, }, { NULL, mfa1, mfa2, }, { NULL, NULL, NULL, }, + { NULL, NULL, NULL, }, { NULL, NULL, NULL, }, { NULL, NULL, mfe2, }, { NULL, mff1, mff2, }, +}; + +static const struct { + const char *name; + unsigned int bit; +} charinfo[] = { + { "iso-8859-2", 0x00000001 }, + { "iso-8859-4", 0x00000002 }, + { "koi8-r", 0x00000004 }, + { "koi8-u", 0x00000008 }, + { "iso-8859-5", 0x00000010 }, + { "iso-8859-6", 0x00000020 }, + { "iso-8859-7", 0x00000040 }, + { "iso-8859-8", 0x00000080 }, + { "iso-8859-9", 0x00000100 }, + { "iso-8859-13", 0x00000200 }, + { "iso-8859-15", 0x00000400 }, + { "windows-1251", 0x00000800 }, + { "iso-2022-jp", 0x00001000 }, + { "Shift-JIS", 0x00002000 }, + { "euc-jp", 0x00004000 }, + { "euc-kr", 0x00008000 }, + { "gb2312", 0x00010000 }, + { "Big5", 0x00020000 }, + { "euc-tw", 0x00040000 }, +}; + +#define charset_mask(x) \ + (charmap[(x) >> 8].bits0 ? charmap[(x) >> 8].bits0[(x) & 0xff] << 0 : 0) \ + | (charmap[(x) >> 8].bits1 ? charmap[(x) >> 8].bits1[(x) & 0xff] << 8 : 0) \ + | (charmap[(x) >> 8].bits2 ? charmap[(x) >> 8].bits2[(x) & 0xff] << 16 : 0) + diff --git a/gmime/gmime-charset.c b/gmime/gmime-charset.c new file mode 100644 index 0000000..f48e7c2 --- /dev/null +++ b/gmime/gmime-charset.c @@ -0,0 +1,947 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_CODESET +#include +#endif + +#if defined (WIN32) || defined (__CYGWIN__) +#define WIN32_LEAN_AND_MEAN +#include +#endif + +#include "gmime-charset-map-private.h" +#include "gmime-table-private.h" +#include "gmime-charset.h" +#include "gmime-iconv.h" + +#ifdef HAVE_ICONV_DETECT_H +#include "iconv-detect.h" +#else /* use old-style detection */ +#if defined (__aix__) || defined (__irix__) || defined (__sun__) +#define ICONV_ISO_INT_FORMAT "ISO%u-%u" +/* this one is for charsets like ISO-2022-JP, for which at least + Solaris wants a - after the ISO */ +#define ICONV_ISO_STR_FORMAT "ISO-%u-%s" +#elif defined (__hpux__) +#define ICONV_ISO_INT_FORMAT "iso%u%u" +#define ICONV_ISO_STR_FORMAT "iso%u%s" +#else +#define ICONV_ISO_INT_FORMAT "iso-%u-%u" +#define ICONV_ISO_STR_FORMAT "iso-%u-%s" +#endif /* __aix__, __irix__, __sun__ */ +#define ICONV_10646 "iso-10646" +#endif /* USE_ICONV_DETECT */ + + +/** + * SECTION: gmime-charset + * @title: gmime-charset + * @short_description: Charset helper functions + * @see_also: + * + * Charset utility functions. + **/ + + +/* a useful website on charset alaises: + * http://www.li18nux.org/subgroups/sa/locnameguide/v1.1draft/CodesetAliasTable-V11.html */ + +static struct { + const char *charset; + const char *iconv_name; +} known_iconv_charsets[] = { + /* charset name, iconv-friendly name (sometimes case sensitive) */ + { "utf-8", "UTF-8" }, + { "utf8", "UTF-8" }, + + /* ANSI_X3.4-1968 is used on some systems and should be + treated the same as US-ASCII */ + { "ANSI_X3.4-1968", NULL }, + + /* 10646 is a special case, its usually UCS-2 big endian */ + /* This might need some checking but should be ok for + solaris/linux */ + { "iso-10646-1", "UCS-2BE" }, + { "iso_10646-1", "UCS-2BE" }, + { "iso10646-1", "UCS-2BE" }, + { "iso-10646", "UCS-2BE" }, + { "iso_10646", "UCS-2BE" }, + { "iso10646", "UCS-2BE" }, + + /* Korean charsets */ + /* Note: according to http://www.iana.org/assignments/character-sets, + * ks_c_5601-1987 should really map to ISO-2022-KR, but the EUC-KR + * mapping was given to me via a native Korean user, so I'm not sure + * if I should change this... perhaps they are compatable? */ + { "ks_c_5601-1987", "EUC-KR" }, + { "5601", "EUC-KR" }, + { "ksc-5601", "EUC-KR" }, + { "ksc-5601-1987", "EUC-KR" }, + { "ksc-5601_1987", "EUC-KR" }, + { "ks_c_5861-1992", "EUC-KR" }, + { "euckr-0", "EUC-KR" }, + + /* Chinese charsets */ + { "big5-0", "BIG5" }, + { "big5.eten-0", "BIG5" }, + { "big5hkscs-0", "BIG5HKSCS" }, + /* Note: GBK is a superset of gb2312 (see + * http://en.wikipedia.org/wiki/GBK for details), so 'upgrade' + * gb2312 to GBK so that we can completely convert GBK text + * that is incorrectly tagged as gb2312 to UTF-8. */ + { "gb2312", "GBK" }, + { "gb-2312", "GBK" }, + { "gb2312-0", "GBK" }, + { "gb2312-80", "GBK" }, + { "gb2312.1980-0", "GBK" }, + /* euc-cn is an alias for gb2312 */ + { "euc-cn", "GBK" }, + { "gb18030-0", "gb18030" }, + { "gbk-0", "GBK" }, + + /* Japanese charsets */ + { "eucjp-0", "eucJP" }, /* should this map to "EUC-JP" instead? */ + { "ujis-0", "ujis" }, /* we might want to map this to EUC-JP */ + { "jisx0208.1983-0", "SJIS" }, + { "jisx0212.1990-0", "SJIS" }, + { "pck", "SJIS" }, + { NULL, NULL } +}; + +/* map CJKR charsets to their language code */ +/* NOTE: only support charset names that will be returned by + * g_mime_charset_iconv_name() so that we don't have to keep track of + * all the aliases too. */ +static struct { + const char *charset; + const char *lang; +} cjkr_lang_map[] = { + { "Big5", "zh" }, + { "BIG5HKSCS", "zh" }, + { "gb2312", "zh" }, + { "gb18030", "zh" }, + { "gbk", "zh" }, + { "euc-tw", "zh" }, + { "iso-2022-jp", "ja" }, + { "Shift-JIS", "ja" }, + { "sjis", "ja" }, + { "ujis", "ja" }, + { "eucJP", "ja" }, + { "euc-jp", "ja" }, + { "euc-kr", "ko" }, + { "koi8-r", "ru" }, + { "koi8-u", "uk" } +}; + +static GHashTable *iconv_charsets = NULL; +static char **user_charsets = NULL; +static char *locale_charset = NULL; +static char *locale_lang = NULL; + +#ifdef G_THREADS_ENABLED +static GStaticMutex charset_lock = G_STATIC_MUTEX_INIT; +#define CHARSET_LOCK() g_static_mutex_lock (&charset_lock); +#define CHARSET_UNLOCK() g_static_mutex_unlock (&charset_lock); +#else +#define CHARSET_LOCK() +#define CHARSET_UNLOCK() +#endif /* G_THREADS_ENABLED */ + + +/** + * g_mime_charset_map_shutdown: + * + * Frees internal lookup tables created in g_mime_charset_map_init(). + **/ +void +g_mime_charset_map_shutdown (void) +{ + if (!iconv_charsets) + return; + + g_hash_table_destroy (iconv_charsets); + iconv_charsets = NULL; + + g_free (locale_charset); + locale_charset = NULL; + + g_free (locale_lang); + locale_lang = NULL; +} + + +static void +locale_parse_lang (const char *locale) +{ + char *codeset, *lang; + + if ((codeset = strchr (locale, '.'))) + lang = g_strndup (locale, (size_t) (codeset - locale)); + else + lang = g_strdup (locale); + + /* validate the language */ + if (strlen (lang) >= 2) { + if (lang[2] == '-' || lang[2] == '_') { + /* canonicalise the lang */ + lang[0] = g_ascii_tolower (lang[0]); + lang[1] = g_ascii_tolower (lang[1]); + + /* validate the country code */ + if (strlen (lang + 3) > 2) { + /* invalid country code */ + lang[2] = '\0'; + } else { + lang[2] = '-'; + lang[3] = g_ascii_toupper (lang[3]); + lang[4] = g_ascii_toupper (lang[4]); + } + } else if (lang[2] != '\0') { + /* invalid language */ + g_free (lang); + lang = NULL; + } + + locale_lang = lang; + } else { + /* invalid language */ + locale_lang = NULL; + g_free (lang); + } +} + + +/** + * g_mime_charset_map_init: + * + * Initializes character set maps. + * + * Note: g_mime_init() calls this routine for you. + **/ +void +g_mime_charset_map_init (void) +{ + char *charset, *iconv_name, *locale; + int i; + + if (iconv_charsets) + return; + + iconv_charsets = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + for (i = 0; known_iconv_charsets[i].charset != NULL; i++) { + charset = g_ascii_strdown (known_iconv_charsets[i].charset, -1); + iconv_name = g_strdup (known_iconv_charsets[i].iconv_name); + g_hash_table_insert (iconv_charsets, charset, iconv_name); + } + +#ifndef WIN32 +#ifdef HAVE_CODESET + if ((locale_charset = nl_langinfo (CODESET)) && locale_charset[0]) { +#ifdef __CYGWIN__ + /* Apparently some versions of Cygwin, nl_langinfo(CODESET) + * always reports US-ASCII no matter what. */ + if (strcmp (locale_charset, "US-ASCII") != 0) { + /* Guess this version of Cygwin is fixed. */ + locale_charset = g_ascii_strdown (locale_charset, -1); + } else { + /* Cannot rely on US-ASCII being accurate. */ + locale_charset = NULL; + } +#else + locale_charset = g_ascii_strdown (locale_charset, -1); +#endif + } else + locale_charset = NULL; +#endif + + /* Apparently setlocale() is not reliable either... use getenv() instead. */ + /*locale = setlocale (LC_ALL, NULL);*/ + + if (!(locale = getenv ("LC_ALL")) || !locale[0]) + if (!(locale = getenv ("LC_CTYPE")) || !locale[0]) + locale = getenv ("LANG"); + + if (!locale || !locale[0] || !strcmp (locale, "C") || !strcmp (locale, "POSIX")) { + /* The locale "C" or "POSIX" is a portable locale; its + * LC_CTYPE part corresponds to the 7-bit ASCII character + * set. */ + + locale_charset = NULL; + locale_lang = NULL; + } else { + /* A locale name is typically of the form language[_terri- + * tory][.codeset][@modifier], where language is an ISO 639 + * language code, territory is an ISO 3166 country code, and + * codeset is a character set or encoding identifier like + * ISO-8859-1 or UTF-8. + */ + char *codeset, *p; + + if (!locale_charset) { + codeset = strchr (locale, '.'); + if (codeset) { + codeset++; + + /* ; is a hack for debian systems and / is a hack for Solaris systems */ + p = codeset; + while (*p && !strchr ("@;/", *p)) + p++; + + locale_charset = g_ascii_strdown (codeset, (size_t)(p - codeset)); + } else { + /* charset unknown */ + locale_charset = NULL; + } + } + + locale_parse_lang (locale); + } +#else /* WIN32 */ + locale_charset = g_strdup_printf ("cp%u", GetACP ()); +#endif +} + + +/** + * g_mime_locale_charset: + * + * Gets the user's locale charset (or iso-8859-1 by default). + * + * Returns: the user's locale charset (or iso-8859-1 by default). + **/ +const char * +g_mime_locale_charset (void) +{ + CHARSET_LOCK (); + if (!iconv_charsets) + g_mime_charset_map_init (); + CHARSET_UNLOCK (); + + return locale_charset ? locale_charset : "iso-8859-1"; +} + + +/** + * g_mime_locale_language: + * + * Gets the user's locale language code (or %NULL by default). + * + * Returns: the user's locale language code (or %NULL by default). + **/ +const char * +g_mime_locale_language (void) +{ + CHARSET_LOCK (); + if (!iconv_charsets) + g_mime_charset_map_init (); + CHARSET_UNLOCK (); + + return locale_lang; +} + + +/** + * g_mime_charset_language: + * @charset: charset name + * + * Attempts to find a specific language code that is specific to + * @charset. Currently only handles CJK and Russian/Ukranian + * charset->lang mapping. Everything else will return %NULL. + * + * Returns: a language code that is specific to @charset, or %NULL on + * fail. + **/ +const char * +g_mime_charset_language (const char *charset) +{ + guint i; + + if (!charset) + return NULL; + + for (i = 0; i < G_N_ELEMENTS (cjkr_lang_map); i++) { + if (!g_ascii_strcasecmp (cjkr_lang_map[i].charset, charset)) + return cjkr_lang_map[i].lang; + } + + return NULL; +} + + +static const char * +strdown (char *str) +{ + register char *s = str; + + while (*s) { + if (*s >= 'A' && *s <= 'Z') + *s += 0x20; + s++; + } + + return str; +} + +/** + * g_mime_charset_iconv_name: + * @charset: charset name + * + * Attempts to find an iconv-friendly charset name for @charset. + * + * Returns: an iconv-friendly charset name for @charset. + **/ +const char * +g_mime_charset_iconv_name (const char *charset) +{ + char *name, *iconv_name, *buf; + + if (charset == NULL) + return NULL; + + name = g_alloca (strlen (charset) + 1); + strcpy (name, charset); + strdown (name); + + CHARSET_LOCK (); + if (!iconv_charsets) + g_mime_charset_map_init (); + + iconv_name = g_hash_table_lookup (iconv_charsets, name); + if (iconv_name) { + CHARSET_UNLOCK (); + return iconv_name; + } + + if (!strncmp (name, "iso", 3)) { + int iso, codepage; + char *p; + + buf = name + 3; + if (*buf == '-' || *buf == '_') + buf++; + + iso = strtoul (buf, &p, 10); + + if (iso == 10646) { + /* they all become ICONV_10646 */ + iconv_name = g_strdup (ICONV_10646); + } else if (p > buf) { + buf = p; + if (*buf == '-' || *buf == '_') + buf++; + + codepage = strtoul (buf, &p, 10); + + if (p > buf) { + /* codepage is numeric */ +#ifdef __aix__ + if (codepage == 13) + iconv_name = g_strdup ("IBM-921"); + else +#endif /* __aix__ */ + iconv_name = g_strdup_printf (ICONV_ISO_INT_FORMAT, + iso, codepage); + } else { + /* codepage is a string - probably iso-2022-jp or something */ + iconv_name = g_strdup_printf (ICONV_ISO_STR_FORMAT, + iso, p); + } + } else { + /* p == buf, which probably means we've + encountered an invalid iso charset name */ + iconv_name = g_strdup (name); + } + } else if (!strncmp (name, "windows-", 8)) { + buf = name + 8; + if (!strncmp (buf, "cp", 2)) + buf += 2; + + iconv_name = g_strdup_printf ("CP%s", buf); + } else if (!strncmp (name, "microsoft-", 10)) { + buf = name + 10; + if (!strncmp (buf, "cp", 2)) + buf += 2; + + iconv_name = g_strdup_printf ("CP%s", buf); + } else { + /* assume charset name is ok as is? */ + iconv_name = g_strdup (charset); + } + + g_hash_table_insert (iconv_charsets, g_strdup (name), iconv_name); + + CHARSET_UNLOCK (); + + return iconv_name; +} + + +static const char *iso_charsets[] = { + "us-ascii", + "iso-8859-1", + "iso-8859-2", + "iso-8859-3", + "iso-8859-4", + "iso-8859-5", + "iso-8859-6", + "iso-8859-7", + "iso-8859-8", + "iso-8859-9", + "iso-8859-10", + "iso-8859-11", + "iso-8859-12", + "iso-8859-13", + "iso-8859-14", + "iso-8859-15", + "iso-8859-16" +}; + +static const char *windows_charsets[] = { + "windows-cp1250", + "windows-cp1251", + "windows-cp1252", + "windows-cp1253", + "windows-cp1254", + "windows-cp1255", + "windows-cp1256", + "windows-cp1257", + "windows-cp1258", + "windows-cp1259" +}; + + +/** + * g_mime_charset_canon_name: + * @charset: charset name + * + * Attempts to find a canonical charset name for @charset. + * + * Note: Will normally return the same value as + * g_mime_charset_iconv_name() unless the system iconv does not use + * the canonical ISO charset names (such as using ISO8859-1 rather + * than the canonical form ISO-8859-1). + * + * Returns: a canonical charset name for @charset. + **/ +const char * +g_mime_charset_canon_name (const char *charset) +{ + const char *ptr; + char *endptr; + guint iso; + + if (!charset) + return NULL; + + charset = g_mime_charset_iconv_name (charset); + if (g_ascii_strncasecmp (charset, "iso", 3) == 0) { + ptr = charset + 3; + if (*ptr == '-' || *ptr == '_') + ptr++; + + if (strncmp (ptr, "8859", 4) != 0) + return charset; + + ptr += 4; + if (*ptr == '-' || *ptr == '_') + ptr++; + + iso = strtoul (ptr, &endptr, 10); + if (endptr == ptr || *endptr != '\0') + return charset; + + if (iso > G_N_ELEMENTS (iso_charsets)) + return charset; + + return iso_charsets[iso]; + } else if (!strncmp (charset, "CP125", 5)) { + ptr = charset + 5; + if (*ptr >= '0' && *ptr <= '9') + return windows_charsets[*ptr - '0']; + } + + return charset; +} + + +/** + * g_mime_charset_name: + * @charset: charset name + * + * Attempts to find an iconv-friendly charset name for @charset. + * + * Note: This function is deprecated. Use g_mime_charset_iconv_name() + * instead. + * + * Returns: an iconv-friendly charset name for @charset. + **/ +const char * +g_mime_charset_name (const char *charset) +{ + return g_mime_charset_iconv_name (charset); +} + + +/** + * g_mime_charset_locale_name: + * + * Gets the user's locale charset (or iso-8859-1 by default). + * + * Note: This function is deprecated. Use g_mime_locale_charset() + * instead. + * + * Returns: the user's locale charset (or iso-8859-1 by default). + **/ +const char * +g_mime_charset_locale_name (void) +{ + return g_mime_locale_charset (); +} + + +/** + * g_mime_charset_iso_to_windows: + * @isocharset: ISO-8859-# charset + * + * Maps the ISO-8859-# charset to the equivalent Windows-CP125# + * charset. + * + * Returns: equivalent Windows charset. + **/ +const char * +g_mime_charset_iso_to_windows (const char *isocharset) +{ + /* According to http://czyborra.com/charsets/codepages.html, + * the charset mapping is as follows: + * + * us-ascii maps to windows-cp1252 + * iso-8859-1 maps to windows-cp1252 + * iso-8859-2 maps to windows-cp1250 + * iso-8859-3 maps to windows-cp???? + * iso-8859-4 maps to windows-cp???? + * iso-8859-5 maps to windows-cp1251 + * iso-8859-6 maps to windows-cp1256 + * iso-8859-7 maps to windows-cp1253 + * iso-8859-8 maps to windows-cp1255 + * iso-8859-9 maps to windows-cp1254 + * iso-8859-10 maps to windows-cp???? + * iso-8859-11 maps to windows-cp???? + * iso-8859-12 maps to windows-cp???? + * iso-8859-13 maps to windows-cp1257 + * + * Assumptions: + * - I'm going to assume that since iso-8859-4 and + * iso-8859-13 are Baltic that it also maps to + * windows-cp1257. + */ + + isocharset = g_mime_charset_canon_name (isocharset); + + if (!g_ascii_strcasecmp (isocharset, "iso-8859-1") || !g_ascii_strcasecmp (isocharset, "us-ascii")) + return "windows-cp1252"; + else if (!g_ascii_strcasecmp (isocharset, "iso-8859-2")) + return "windows-cp1250"; + else if (!g_ascii_strcasecmp (isocharset, "iso-8859-4")) + return "windows-cp1257"; + else if (!g_ascii_strcasecmp (isocharset, "iso-8859-5")) + return "windows-cp1251"; + else if (!g_ascii_strcasecmp (isocharset, "iso-8859-6")) + return "windows-cp1256"; + else if (!g_ascii_strcasecmp (isocharset, "iso-8859-7")) + return "windows-cp1253"; + else if (!g_ascii_strcasecmp (isocharset, "iso-8859-8")) + return "windows-cp1255"; + else if (!g_ascii_strcasecmp (isocharset, "iso-8859-9")) + return "windows-cp1254"; + else if (!g_ascii_strcasecmp (isocharset, "iso-8859-13")) + return "windows-cp1257"; + + return isocharset; +} + + +/** + * g_mime_charset_init: + * @charset: charset mask + * + * Initializes a charset mask structure. + **/ +void +g_mime_charset_init (GMimeCharset *charset) +{ + charset->mask = (unsigned int) ~0; + charset->level = 0; +} + + +/** + * g_mime_charset_step: + * @charset: charset structure + * @inbuf: input text buffer (must be in UTF-8) + * @inlen: input buffer length + * + * Steps through the input buffer 1 unicode character (glyph) at a + * time (ie, not necessarily 1 byte at a time). Bitwise 'and' our + * @charset->mask with the mask for each glyph. This has the effect of + * limiting what charsets our @charset->mask can match. + **/ +void +g_mime_charset_step (GMimeCharset *charset, const char *inbuf, size_t inlen) +{ + register const char *inptr = inbuf; + const char *inend = inbuf + inlen; + register unsigned int mask; + register int level; + + mask = charset->mask; + level = charset->level; + + while (inptr < inend) { + const char *newinptr; + gunichar c; + + newinptr = g_utf8_next_char (inptr); + c = g_utf8_get_char (inptr); + if (newinptr == NULL || !g_unichar_validate (c)) { + inptr++; + continue; + } + + inptr = newinptr; + if (c <= 0xffff) { + mask &= charset_mask (c); + + if (c >= 128 && c < 256) + level = MAX (level, 1); + else if (c >= 256) + level = 2; + } else { + mask = 0; + level = 2; + } + } + + charset->mask = mask; + charset->level = level; +} + +static const char * +charset_best_mask (unsigned int mask) +{ + const char *lang; + guint i; + + for (i = 0; i < G_N_ELEMENTS (charinfo); i++) { + if (charinfo[i].bit & mask) { + lang = g_mime_charset_language (charinfo[i].name); + + if (!lang || (locale_lang && !strncmp (locale_lang, lang, 2))) + return charinfo[i].name; + } + } + + return "UTF-8"; +} + + +/** + * g_mime_charset_best_name: + * @charset: charset mask + * + * Gets the best charset name based on the charset mask @charset. + * + * Returns: a pointer to a string containing the best charset name that + * can represent the charset mask @charset. + **/ +const char * +g_mime_charset_best_name (GMimeCharset *charset) +{ + if (charset->level == 1) + return "iso-8859-1"; + else if (charset->level == 2) + return charset_best_mask (charset->mask); + else + return NULL; +} + + +/** + * g_mime_charset_best: + * @inbuf: a UTF-8 text buffer + * @inlen: input buffer length + * + * Computes the best charset to use to encode this text buffer. + * + * Returns: the charset name best suited for the input text or %NULL if + * it is US-ASCII safe. + **/ +const char * +g_mime_charset_best (const char *inbuf, size_t inlen) +{ + GMimeCharset charset; + + g_mime_charset_init (&charset); + g_mime_charset_step (&charset, inbuf, inlen); + + return g_mime_charset_best_name (&charset); +} + + +/** + * g_mime_charset_can_encode: + * @mask: a #GMimeCharset mask + * @charset: a charset + * @text: utf-8 text to check + * @len: length of @text + * + * Check to see if the UTF-8 @text will fit safely within @charset. + * + * Returns: %TRUE if it is safe to encode @text into @charset or %FALSE + * otherwise. + **/ +gboolean +g_mime_charset_can_encode (GMimeCharset *mask, const char *charset, const char *text, size_t len) +{ + const unsigned char *inptr = (const unsigned char *) text; + const unsigned char *inend = inptr + len; + size_t inleft, outleft, rc; + const char *inbuf = text; + char out[256], *outbuf; + const char *iconv_name; + iconv_t cd; + guint i; + + if (len == 0) + return TRUE; + + if (mask->level == 0 && (!charset || !g_ascii_strcasecmp (charset, "us-ascii"))) { + /* simple US-ASCII case - is this scan even necessary? */ + while (inptr < inend && is_ascii (*inptr)) + inptr++; + + if (inptr == inend) + return TRUE; + + return FALSE; + } + + if (!g_ascii_strcasecmp (charset, "utf-8")) { + /* we can encode anything in utf-8 */ + return TRUE; + } + + charset = g_mime_charset_iconv_name (charset); + + if (mask->level == 1) + return !g_ascii_strcasecmp (charset, "iso-8859-1"); + + /* check if this is a charset that we have precalculated masking for */ + for (i = 0; i < G_N_ELEMENTS (charinfo); i++) { + iconv_name = g_mime_charset_iconv_name (charinfo[i].name); + if (charset == iconv_name) + break; + } + + if (i < G_N_ELEMENTS (charinfo)) { + /* indeed we do... */ + return (charinfo[i].bit & mask->mask); + } + + /* down to the nitty gritty slow and painful way... */ + if ((cd = g_mime_iconv_open (charset, "UTF-8")) == (iconv_t) -1) + return FALSE; + + inleft = len; + + do { + outleft = sizeof (out); + outbuf = out; + errno = 0; + + rc = iconv (cd, (char **) &inbuf, &inleft, &outbuf, &outleft); + if (rc == (size_t) -1 && errno != E2BIG) + break; + } while (inleft > 0); + + if (inleft == 0) { + outleft = sizeof (out); + outbuf = out; + errno = 0; + + rc = iconv (cd, NULL, NULL, &outbuf, &outleft); + } + + g_mime_iconv_close (cd); + + return rc != (size_t) -1; +} + + +/** + * g_mime_set_user_charsets: + * @charsets: an array of user-preferred charsets + * + * Set a list of charsets for GMime to use as a hint for encoding and + * decoding headers. The charset list should be in order of preference + * (e.g. most preferred first, least preferred last). + **/ +void +g_mime_set_user_charsets (const char **charsets) +{ + if (user_charsets) + g_strfreev (user_charsets); + + if (charsets == NULL || charsets[0] == NULL) { + user_charsets = NULL; + return; + } + + user_charsets = g_strdupv ((char **) charsets); +} + + +/** + * g_mime_user_charsets: + * + * Get the list of user-preferred charsets set with + * g_mime_set_user_charsets(). + * + * Returns: an array of user-set charsets or %NULL if none set. + **/ +const char ** +g_mime_user_charsets (void) +{ + return (const char **) user_charsets; +} diff --git a/gmime/gmime-charset.h b/gmime/gmime-charset.h new file mode 100644 index 0000000..191d5cf --- /dev/null +++ b/gmime/gmime-charset.h @@ -0,0 +1,77 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_CHARSET_H__ +#define __GMIME_CHARSET_H__ + +#include +#include + +G_BEGIN_DECLS + +void g_mime_charset_map_init (void); +void g_mime_charset_map_shutdown (void); + +const char *g_mime_locale_charset (void); +const char *g_mime_locale_language (void); + +const char *g_mime_charset_language (const char *charset); + +const char *g_mime_charset_canon_name (const char *charset); +const char *g_mime_charset_iconv_name (const char *charset); + +#ifndef GMIME_DISABLE_DEPRECATED +const char *g_mime_charset_name (const char *charset); +const char *g_mime_charset_locale_name (void); +#endif + +const char *g_mime_charset_iso_to_windows (const char *isocharset); + + +/** + * GMimeCharset: + * @mask: charset mask + * @level: charset level + * + * State used by g_mime_charset_best() and g_mime_charset_best_name(). + **/ +typedef struct _GMimeCharset { + unsigned int mask; + unsigned int level; +} GMimeCharset; + +void g_mime_charset_init (GMimeCharset *charset); +void g_mime_charset_step (GMimeCharset *charset, const char *inbuf, size_t inlen); +const char *g_mime_charset_best_name (GMimeCharset *charset); + +const char *g_mime_charset_best (const char *inbuf, size_t inlen); + +gboolean g_mime_charset_can_encode (GMimeCharset *mask, const char *charset, + const char *text, size_t len); + + +void g_mime_set_user_charsets (const char **charsets); +const char **g_mime_user_charsets (void); + + +G_END_DECLS + +#endif /* __GMIME_CHARSET_H__ */ diff --git a/gmime/gmime-common.c b/gmime/gmime-common.c new file mode 100644 index 0000000..ab4c0f8 --- /dev/null +++ b/gmime/gmime-common.c @@ -0,0 +1,86 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-table-private.h" +#include "gmime-common.h" + +#ifndef g_tolower +#define g_tolower(x) (((x) >= 'A' && (x) <= 'Z') ? (x) - 'A' + 'a' : (x)) +#endif + +int +g_mime_strcase_equal (gconstpointer v, gconstpointer v2) +{ + return g_ascii_strcasecmp ((const char *) v, (const char *) v2) == 0; +} + + +guint +g_mime_strcase_hash (gconstpointer key) +{ + const char *p = key; + guint h = 0; + + while (*p != '\0') { + h = (h << 5) - h + g_tolower (*p); + p++; + } + + return h; +} + + +/** + * g_mime_strdup_trim: + * @str: The string to duplicate and trim + * + * Duplicates the given input string while also trimming leading and + * trailing whitespace. + * + * Returns a duplicate string, minus any leading and trailing + * whitespace that the original string may have contained. + **/ +char * +g_mime_strdup_trim (const char *str) +{ + register const char *inptr = str; + register const char *end; + const char *start; + + while (is_lwsp (*inptr)) + inptr++; + + start = inptr; + end = inptr; + + while (*inptr) { + if (!is_lwsp (*inptr++)) + end = inptr; + } + + return g_strndup (start, (size_t) (end - start)); +} diff --git a/gmime/gmime-common.h b/gmime/gmime-common.h new file mode 100644 index 0000000..5212a49 --- /dev/null +++ b/gmime/gmime-common.h @@ -0,0 +1,37 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_COMMON_H__ +#define __GMIME_COMMON_H__ + +#include + +G_BEGIN_DECLS + +G_GNUC_INTERNAL int g_mime_strcase_equal (gconstpointer v, gconstpointer v2); + +G_GNUC_INTERNAL guint g_mime_strcase_hash (gconstpointer key); + +G_GNUC_INTERNAL char *g_mime_strdup_trim (const char *str); + +G_END_DECLS + +#endif /* __GMIME_COMMON_H__ */ diff --git a/gmime/gmime-content-type.c b/gmime/gmime-content-type.c new file mode 100644 index 0000000..66ba1ba --- /dev/null +++ b/gmime/gmime-content-type.c @@ -0,0 +1,447 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gmime-common.h" +#include "gmime-content-type.h" +#include "gmime-parse-utils.h" +#include "gmime-events.h" + + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + +#define d(x) + + +/** + * SECTION: gmime-content-type + * @title: GMimeContentType + * @short_description: Content-Type fields + * @see_also: + * + * A #GMimeContentType represents the pre-parsed contents of a + * Content-Type header field. + **/ + + +static void g_mime_content_type_class_init (GMimeContentTypeClass *klass); +static void g_mime_content_type_init (GMimeContentType *content_type, GMimeContentTypeClass *klass); +static void g_mime_content_type_finalize (GObject *object); + + +static GObjectClass *parent_class = NULL; + + +GType +g_mime_content_type_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeContentTypeClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_content_type_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeContentType), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_content_type_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeContentType", &info, 0); + } + + return type; +} + + +static void +g_mime_content_type_class_init (GMimeContentTypeClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_content_type_finalize; +} + +static void +g_mime_content_type_init (GMimeContentType *content_type, GMimeContentTypeClass *klass) +{ + content_type->param_hash = g_hash_table_new (g_mime_strcase_hash, g_mime_strcase_equal); + content_type->priv = g_mime_event_new ((GObject *) content_type); + content_type->params = NULL; + content_type->subtype = NULL; + content_type->type = NULL; +} + +static void +g_mime_content_type_finalize (GObject *object) +{ + GMimeContentType *content_type = (GMimeContentType *) object; + + g_hash_table_destroy (content_type->param_hash); + g_mime_param_destroy (content_type->params); + g_mime_event_destroy (content_type->priv); + g_free (content_type->subtype); + g_free (content_type->type); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +/** + * g_mime_content_type_new: + * @type: MIME type (or %NULL for "text") + * @subtype: MIME subtype (or %NULL for "plain") + * + * Creates a Content-Type object with type @type and subtype @subtype. + * + * Returns: a new #GMimeContentType object. + **/ +GMimeContentType * +g_mime_content_type_new (const char *type, const char *subtype) +{ + GMimeContentType *mime_type; + + mime_type = g_object_newv (GMIME_TYPE_CONTENT_TYPE, 0, NULL); + + if (type && *type && subtype && *subtype) { + mime_type->type = g_strdup (type); + mime_type->subtype = g_strdup (subtype); + } else { + if (type && *type) { + mime_type->type = g_strdup (type); + if (!g_ascii_strcasecmp (type, "text")) { + mime_type->subtype = g_strdup ("plain"); + } else if (!g_ascii_strcasecmp (type, "multipart")) { + mime_type->subtype = g_strdup ("mixed"); + } else { + g_free (mime_type->type); + mime_type->type = g_strdup ("application"); + mime_type->subtype = g_strdup ("octet-stream"); + } + } else { + mime_type->type = g_strdup ("application"); + mime_type->subtype = g_strdup ("octet-stream"); + } + + w(g_warning ("Invalid or incomplete type: %s%s%s: defaulting to %s/%s", + type ? type : "", subtype ? "/" : "", subtype ? subtype : "", + mime_type->type, mime_type->subtype)); + } + + return mime_type; +} + + +/** + * g_mime_content_type_new_from_string: + * @str: input string containing a content-type (and params) + * + * Constructs a new Content-Type object based on the input string. + * + * Returns: a new #GMimeContentType object based on the input string. + **/ +GMimeContentType * +g_mime_content_type_new_from_string (const char *str) +{ + GMimeContentType *mime_type; + const char *inptr = str; + char *type, *subtype; + + g_return_val_if_fail (str != NULL, NULL); + + if (!g_mime_parse_content_type (&inptr, &type, &subtype)) + return g_mime_content_type_new ("application", "octet-stream"); + + mime_type = g_object_newv (GMIME_TYPE_CONTENT_TYPE, 0, NULL); + mime_type->subtype = subtype; + mime_type->type = type; + + /* skip past any remaining junk that shouldn't be here... */ + decode_lwsp (&inptr); + while (*inptr && *inptr != ';') + inptr++; + + if (*inptr++ == ';' && *inptr) { + GMimeParam *param; + + param = mime_type->params = g_mime_param_new_from_string (inptr); + while (param != NULL) { + g_hash_table_insert (mime_type->param_hash, param->name, param); + param = param->next; + } + } + + return mime_type; +} + + +/** + * g_mime_content_type_to_string: + * @mime_type: a #GMimeContentType object + * + * Allocates a string buffer containing the type and subtype defined + * by the @mime_type. + * + * Returns: an allocated string containing the type and subtype of the + * content-type in the format: type/subtype. + **/ +char * +g_mime_content_type_to_string (GMimeContentType *mime_type) +{ + char *string; + + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), NULL); + + /* type and subtype should never be NULL, but check anyway */ + string = g_strdup_printf ("%s/%s", mime_type->type ? mime_type->type : "text", + mime_type->subtype ? mime_type->subtype : "plain"); + + return string; +} + + +/** + * g_mime_content_type_is_type: + * @mime_type: a #GMimeContentType object + * @type: MIME type to compare against + * @subtype: MIME subtype to compare against + * + * Compares the given type and subtype with that of the given mime + * type object. + * + * Returns: TRUE if the MIME types match or FALSE otherwise. You may + * use "*" in place of @type and/or @subtype as a wilcard. + **/ +gboolean +g_mime_content_type_is_type (GMimeContentType *mime_type, const char *type, const char *subtype) +{ + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), FALSE); + g_return_val_if_fail (mime_type->type != NULL, FALSE); + g_return_val_if_fail (mime_type->subtype != NULL, FALSE); + g_return_val_if_fail (type != NULL, FALSE); + g_return_val_if_fail (subtype != NULL, FALSE); + + if (!strcmp (type, "*") || !g_ascii_strcasecmp (mime_type->type, type)) { + if (!strcmp (subtype, "*")) { + /* special case */ + return TRUE; + } + + if (!g_ascii_strcasecmp (mime_type->subtype, subtype)) + return TRUE; + } + + return FALSE; +} + + +/** + * g_mime_content_type_set_media_type: + * @mime_type: a #GMimeContentType object + * @type: media type + * + * Sets the Content-Type's media type. + **/ +void +g_mime_content_type_set_media_type (GMimeContentType *mime_type, const char *type) +{ + char *buf; + + g_return_if_fail (GMIME_IS_CONTENT_TYPE (mime_type)); + g_return_if_fail (type != NULL); + + buf = g_strdup (type); + g_free (mime_type->type); + mime_type->type = buf; + + g_mime_event_emit (mime_type->priv, NULL); +} + + +/** + * g_mime_content_type_get_media_type: + * @mime_type: a #GMimeContentType object + * + * Gets the Content-Type's media type. + * + * Returns: the Content-Type's media type. + **/ +const char * +g_mime_content_type_get_media_type (GMimeContentType *mime_type) +{ + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), NULL); + + return mime_type->type; +} + + +/** + * g_mime_content_type_set_media_subtype: + * @mime_type: a #GMimeContentType object + * @subtype: media subtype + * + * Sets the Content-Type's media subtype. + **/ +void +g_mime_content_type_set_media_subtype (GMimeContentType *mime_type, const char *subtype) +{ + char *buf; + + g_return_if_fail (GMIME_IS_CONTENT_TYPE (mime_type)); + g_return_if_fail (subtype != NULL); + + buf = g_strdup (subtype); + g_free (mime_type->subtype); + mime_type->subtype = buf; + + g_mime_event_emit (mime_type->priv, NULL); +} + + +/** + * g_mime_content_type_get_media_subtype: + * @mime_type: a #GMimeContentType object + * + * Gets the Content-Type's media sub-type. + * + * Returns: the Content-Type's media sub-type. + **/ +const char * +g_mime_content_type_get_media_subtype (GMimeContentType *mime_type) +{ + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), NULL); + + return mime_type->subtype; +} + + +/** + * g_mime_content_type_set_params: + * @mime_type: a #GMimeContentType object + * @params: a list of #GMimeParam objects + * + * Sets the Content-Type's parameter list. + **/ +void +g_mime_content_type_set_params (GMimeContentType *mime_type, GMimeParam *params) +{ + g_return_if_fail (GMIME_IS_CONTENT_TYPE (mime_type)); + + /* clear the current list/hash */ + g_hash_table_remove_all (mime_type->param_hash); + g_mime_param_destroy (mime_type->params); + mime_type->params = params; + + while (params != NULL) { + g_hash_table_insert (mime_type->param_hash, params->name, params); + params = params->next; + } + + g_mime_event_emit (mime_type->priv, NULL); +} + + +/** + * g_mime_content_type_get_params: + * @mime_type: a #GMimeContentType object + * + * Gets the Content-Type's parameter list. + * + * Returns: the Content-Type's parameter list. + **/ +const GMimeParam * +g_mime_content_type_get_params (GMimeContentType *mime_type) +{ + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), NULL); + + return mime_type->params; +} + + +/** + * g_mime_content_type_set_parameter: + * @mime_type: MIME Content-Type + * @attribute: parameter name (aka attribute) + * @value: parameter value + * + * Sets a parameter on the Content-Type. + **/ +void +g_mime_content_type_set_parameter (GMimeContentType *mime_type, const char *attribute, const char *value) +{ + GMimeParam *param = NULL; + + g_return_if_fail (GMIME_IS_CONTENT_TYPE (mime_type)); + g_return_if_fail (attribute != NULL); + g_return_if_fail (value != NULL); + + if ((param = g_hash_table_lookup (mime_type->param_hash, attribute))) { + g_free (param->value); + param->value = g_strdup (value); + } else { + param = g_mime_param_new (attribute, value); + mime_type->params = g_mime_param_append_param (mime_type->params, param); + g_hash_table_insert (mime_type->param_hash, param->name, param); + } + + g_mime_event_emit (mime_type->priv, NULL); +} + + +/** + * g_mime_content_type_get_parameter: + * @mime_type: a #GMimeContentType object + * @attribute: parameter name (aka attribute) + * + * Gets the parameter value specified by @attribute if it's available. + * + * Returns: a const pointer to the paramer value specified by + * @attribute or %NULL on fail. + **/ +const char * +g_mime_content_type_get_parameter (GMimeContentType *mime_type, const char *attribute) +{ + GMimeParam *param; + + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (mime_type), NULL); + g_return_val_if_fail (attribute != NULL, NULL); + + if (!(param = g_hash_table_lookup (mime_type->param_hash, attribute))) + return NULL; + + return param->value; +} diff --git a/gmime/gmime-content-type.h b/gmime/gmime-content-type.h new file mode 100644 index 0000000..6aa10e9 --- /dev/null +++ b/gmime/gmime-content-type.h @@ -0,0 +1,93 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_CONTENT_TYPE_H__ +#define __GMIME_CONTENT_TYPE_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_CONTENT_TYPE (g_mime_content_type_get_type ()) +#define GMIME_CONTENT_TYPE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), g_mime_content_type_get_type (), GMimeContentType)) +#define GMIME_CONTENT_TYPE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), g_mime_content_type_get_type (), GMimeContentTypeClass)) +#define GMIME_IS_CONTENT_TYPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), g_mime_content_type_get_type ())) +#define GMIME_IS_CONTENT_TYPE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), g_mime_content_type_get_type ())) +#define GMIME_CONTENT_TYPE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), g_mime_content_type_get_type (), GMimeContentTypeClass)) + +typedef struct _GMimeContentType GMimeContentType; +typedef struct _GMimeContentTypeClass GMimeContentTypeClass; + +/** + * GMimeContentType: + * @parent_object: parent #GObject + * @param_hash: parameter hash keyed by param name + * @params: a #GMimeParam list + * @type: media type + * @subtype: media subtype + * + * A data structure representing a Content-Type. + **/ +struct _GMimeContentType { + GObject parent_object; + + GHashTable *param_hash; + GMimeParam *params; + + gpointer priv; + + char *type; + char *subtype; +}; + +struct _GMimeContentTypeClass { + GObjectClass parent_class; + +}; + +GType g_mime_content_type_get_type (void); + + +GMimeContentType *g_mime_content_type_new (const char *type, const char *subtype); +GMimeContentType *g_mime_content_type_new_from_string (const char *str); + +char *g_mime_content_type_to_string (GMimeContentType *mime_type); + +gboolean g_mime_content_type_is_type (GMimeContentType *mime_type, const char *type, const char *subtype); + +void g_mime_content_type_set_media_type (GMimeContentType *mime_type, const char *type); +const char *g_mime_content_type_get_media_type (GMimeContentType *mime_type); + +void g_mime_content_type_set_media_subtype (GMimeContentType *mime_type, const char *subtype); +const char *g_mime_content_type_get_media_subtype (GMimeContentType *mime_type); + +void g_mime_content_type_set_params (GMimeContentType *mime_type, GMimeParam *params); +const GMimeParam *g_mime_content_type_get_params (GMimeContentType *mime_type); + +void g_mime_content_type_set_parameter (GMimeContentType *mime_type, const char *attribute, const char *value); +const char *g_mime_content_type_get_parameter (GMimeContentType *mime_type, const char *attribute); + +G_END_DECLS + +#endif /* __GMIME_CONTENT_TYPE_H__ */ diff --git a/gmime/gmime-crypto-context.c b/gmime/gmime-crypto-context.c new file mode 100644 index 0000000..535f38e --- /dev/null +++ b/gmime/gmime-crypto-context.c @@ -0,0 +1,750 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gmime-crypto-context.h" +#include "gmime-error.h" + + +/** + * SECTION: gmime-crypto-context + * @title: GMimeCryptoContext + * @short_description: Encryption/signing contexts + * @see_also: + * + * A #GMimeCryptoContext is used for encrypting, decrypting, signing + * and verifying cryptographic signatures. + **/ + + +static void g_mime_crypto_context_class_init (GMimeCryptoContextClass *klass); +static void g_mime_crypto_context_init (GMimeCryptoContext *ctx, GMimeCryptoContextClass *klass); +static void g_mime_crypto_context_finalize (GObject *object); + +static GMimeDigestAlgo crypto_digest_id (GMimeCryptoContext *ctx, const char *name); + +static const char *crypto_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo ); + +static const char *crypto_get_signature_protocol (GMimeCryptoContext *ctx); + +static const char *crypto_get_encryption_protocol (GMimeCryptoContext *ctx); + +static const char *crypto_get_key_exchange_protocol (GMimeCryptoContext *ctx); + +static int crypto_sign (GMimeCryptoContext *ctx, const char *userid, + GMimeDigestAlgo digest, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +static GMimeSignatureList *crypto_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *sigstream, + GError **err); + +static int crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, + const char *userid, GMimeDigestAlgo digest, + GPtrArray *recipients, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +static GMimeDecryptResult *crypto_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +static int crypto_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, + GError **err); + +static int crypto_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, + GMimeStream *ostream, GError **err); + + +static GObjectClass *parent_class = NULL; + + +GType +g_mime_crypto_context_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeCryptoContextClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_crypto_context_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeCryptoContext), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_crypto_context_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeCryptoContext", &info, 0); + } + + return type; +} + + +static void +g_mime_crypto_context_class_init (GMimeCryptoContextClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_crypto_context_finalize; + + klass->digest_id = crypto_digest_id; + klass->digest_name = crypto_digest_name; + klass->sign = crypto_sign; + klass->verify = crypto_verify; + klass->encrypt = crypto_encrypt; + klass->decrypt = crypto_decrypt; + klass->import_keys = crypto_import_keys; + klass->export_keys = crypto_export_keys; + klass->get_signature_protocol = crypto_get_signature_protocol; + klass->get_encryption_protocol = crypto_get_encryption_protocol; + klass->get_key_exchange_protocol = crypto_get_key_exchange_protocol; +} + +static void +g_mime_crypto_context_init (GMimeCryptoContext *ctx, GMimeCryptoContextClass *klass) +{ + ctx->request_passwd = NULL; +} + +static void +g_mime_crypto_context_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +/** + * g_mime_crypto_context_set_request_password: + * @ctx: a #GMimeCryptoContext + * @request_passwd: a callback function for requesting a password + * + * Sets the function used by the @ctx for requesting a password from + * the user. + **/ +void +g_mime_crypto_context_set_request_password (GMimeCryptoContext *ctx, GMimePasswordRequestFunc request_passwd) +{ + g_return_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx)); + + ctx->request_passwd = request_passwd; +} + + +static GMimeDigestAlgo +crypto_digest_id (GMimeCryptoContext *ctx, const char *name) +{ + return GMIME_DIGEST_ALGO_DEFAULT; +} + + +/** + * g_mime_crypto_context_get_request_password: + * @ctx: a #GMimeCryptoContext + * + * Gets the function used by the @ctx for requesting a password from + * the user. + * + * Returns: a #GMimePasswordRequestFunc or %NULL if not set. + **/ +GMimePasswordRequestFunc +g_mime_crypto_context_get_request_password (GMimeCryptoContext *ctx) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + + return ctx->request_passwd; +} + + +/** + * g_mime_crypto_context_digest_id: + * @ctx: a #GMimeCryptoContext + * @name: digest name + * + * Gets the digest id based on the digest name. + * + * Returns: the equivalent digest id or #GMIME_DIGEST_ALGO_DEFAULT on fail. + **/ +GMimeDigestAlgo +g_mime_crypto_context_digest_id (GMimeCryptoContext *ctx, const char *name) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), GMIME_DIGEST_ALGO_DEFAULT); + g_return_val_if_fail (name != NULL, GMIME_DIGEST_ALGO_DEFAULT); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->digest_id (ctx, name); +} + + +static const char * +crypto_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest) +{ + return NULL; +} + + +/** + * g_mime_crypto_context_digest_name: + * @ctx: a #GMimeCryptoContext + * @digest: digest id + * + * Gets the digest name based on the digest id @digest. + * + * Returns: the equivalent digest name or %NULL on fail. + **/ +const char * +g_mime_crypto_context_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->digest_name (ctx, digest); +} + + +static const char * +crypto_get_signature_protocol (GMimeCryptoContext *ctx) +{ + return NULL; +} + + +/** + * g_mime_crypto_context_get_signature_protocol: + * @ctx: a #GMimeCryptoContext + * + * Gets the signature protocol for the crypto context. + * + * Returns: the signature protocol or %NULL if not supported. + **/ +const char * +g_mime_crypto_context_get_signature_protocol (GMimeCryptoContext *ctx) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->get_signature_protocol (ctx); +} + + +static const char * +crypto_get_encryption_protocol (GMimeCryptoContext *ctx) +{ + return NULL; +} + + +/** + * g_mime_crypto_context_get_encryption_protocol: + * @ctx: a #GMimeCryptoContext + * + * Gets the encryption protocol for the crypto context. + * + * Returns: the encryption protocol or %NULL if not supported. + **/ +const char * +g_mime_crypto_context_get_encryption_protocol (GMimeCryptoContext *ctx) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->get_encryption_protocol (ctx); +} + + +static const char * +crypto_get_key_exchange_protocol (GMimeCryptoContext *ctx) +{ + return NULL; +} + + +/** + * g_mime_crypto_context_get_key_exchange_protocol: + * @ctx: a #GMimeCryptoContext + * + * Gets the key exchange protocol for the crypto context. + * + * Returns: the key exchange protocol or %NULL if not supported. + **/ +const char * +g_mime_crypto_context_get_key_exchange_protocol (GMimeCryptoContext *ctx) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->get_key_exchange_protocol (ctx); +} + + +static int +crypto_sign (GMimeCryptoContext *ctx, const char *userid, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *ostream, GError **err) +{ + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "Signing is not supported by this crypto context"); + + return -1; +} + + +/** + * g_mime_crypto_context_sign: + * @ctx: a #GMimeCryptoContext + * @userid: private key to use to sign the stream + * @digest: digest algorithm to use + * @istream: input stream + * @ostream: output stream + * @err: a #GError + * + * Signs the input stream and writes the resulting signature to the output stream. + * + * Returns: the #GMimeDigestAlgo used on success (useful if @digest is + * specified as #GMIME_DIGEST_ALGO_DEFAULT) or %-1 on fail. + **/ +int +g_mime_crypto_context_sign (GMimeCryptoContext *ctx, const char *userid, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *ostream, GError **err) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); + g_return_val_if_fail (GMIME_IS_STREAM (istream), -1); + g_return_val_if_fail (GMIME_IS_STREAM (ostream), -1); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->sign (ctx, userid, digest, istream, ostream, err); +} + + +static GMimeSignatureList * +crypto_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, GMimeStream *istream, + GMimeStream *sigstream, GError **err) +{ + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "Verifying is not supported by this crypto context"); + + return NULL; +} + + +/** + * g_mime_crypto_context_verify: + * @ctx: a #GMimeCryptoContext + * @digest: digest algorithm used, if known + * @istream: input stream + * @sigstream: optional detached-signature stream + * @err: a #GError + * + * Verifies the signature. If @istream is a clearsigned stream, + * you should pass %NULL as the sigstream parameter. Otherwise + * @sigstream is assumed to be the signature stream and is used to + * verify the integirity of the @istream. + * + * Returns: a #GMimeSignatureList object containing the status of each + * signature or %NULL on error. + **/ +GMimeSignatureList * +g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, GMimeStream *istream, + GMimeStream *sigstream, GError **err) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + g_return_val_if_fail (GMIME_IS_STREAM (istream), NULL); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->verify (ctx, digest, istream, sigstream, err); +} + + +static int +crypto_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeDigestAlgo digest, + GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err) +{ + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "Encryption is not supported by this crypto context"); + + return -1; +} + + +/** + * g_mime_crypto_context_encrypt: + * @ctx: a #GMimeCryptoContext + * @sign: sign as well as encrypt + * @userid: key id (or email address) to use when signing (assuming @sign is %TRUE) + * @digest: digest algorithm to use when signing + * @recipients: an array of recipient key ids and/or email addresses + * @istream: cleartext input stream + * @ostream: ciphertext output stream + * @err: a #GError + * + * Encrypts (and optionally signs) the cleartext input stream and + * writes the resulting ciphertext to the output stream. + * + * Returns: %0 on success or %-1 on fail. + **/ +int +g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, GMimeDigestAlgo digest, + GPtrArray *recipients, GMimeStream *istream, GMimeStream *ostream, GError **err) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); + g_return_val_if_fail (GMIME_IS_STREAM (istream), -1); + g_return_val_if_fail (GMIME_IS_STREAM (ostream), -1); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->encrypt (ctx, sign, userid, digest, recipients, istream, ostream, err); +} + + +static GMimeDecryptResult * +crypto_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, + GMimeStream *ostream, GError **err) +{ + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "Decryption is not supported by this crypto context"); + + return NULL; +} + + +/** + * g_mime_crypto_context_decrypt: + * @ctx: a #GMimeCryptoContext + * @istream: input/ciphertext stream + * @ostream: output/cleartext stream + * @err: a #GError + * + * Decrypts the ciphertext input stream and writes the resulting + * cleartext to the output stream. + * + * If the encrypted input stream was also signed, the returned + * #GMimeDecryptResult will have a non-%NULL list of signatures, each with a + * #GMimeSignatureStatus (among other details about each signature). + * + * On success, the returned #GMimeDecryptResult will contain a list of + * certificates, one for each recipient, that the original encrypted stream + * was encrypted to. + * + * Returns: a #GMimeDecryptResult on success or %NULL on error. + **/ +GMimeDecryptResult * +g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, + GMimeStream *ostream, GError **err) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + g_return_val_if_fail (GMIME_IS_STREAM (istream), NULL); + g_return_val_if_fail (GMIME_IS_STREAM (ostream), NULL); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->decrypt (ctx, istream, ostream, err); +} + + +static int +crypto_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err) +{ + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "You may not import keys with this crypto"); + + return -1; +} + + +/** + * g_mime_crypto_context_import_keys: + * @ctx: a #GMimeCryptoContext + * @istream: input stream (containing keys) + * @err: a #GError + * + * Imports a stream of keys/certificates contained within @istream + * into the key/certificate database controlled by @ctx. + * + * Returns: %0 on success or %-1 on fail. + **/ +int +g_mime_crypto_context_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); + g_return_val_if_fail (GMIME_IS_STREAM (istream), -1); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->import_keys (ctx, istream, err); +} + + +static int +crypto_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, + GMimeStream *ostream, GError **err) +{ + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + "You may not export keys with this crypto"); + + return -1; +} + + +/** + * g_mime_crypto_context_export_keys: + * @ctx: a #GMimeCryptoContext + * @keys: an array of key ids + * @ostream: output stream + * @err: a #GError + * + * Exports the keys/certificates in @keys to the stream @ostream from + * the key/certificate database controlled by @ctx. + * + * Returns: %0 on success or %-1 on fail. + **/ +int +g_mime_crypto_context_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, + GMimeStream *ostream, GError **err) +{ + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); + g_return_val_if_fail (GMIME_IS_STREAM (ostream), -1); + g_return_val_if_fail (keys != NULL, -1); + + return GMIME_CRYPTO_CONTEXT_GET_CLASS (ctx)->export_keys (ctx, keys, ostream, err); +} + + +static void g_mime_decrypt_result_class_init (GMimeDecryptResultClass *klass); +static void g_mime_decrypt_result_init (GMimeDecryptResult *cert, GMimeDecryptResultClass *klass); +static void g_mime_decrypt_result_finalize (GObject *object); + +static GObjectClass *result_parent_class = NULL; + + +GType +g_mime_decrypt_result_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeDecryptResultClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_decrypt_result_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeDecryptResult), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_decrypt_result_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeDecryptResult", &info, 0); + } + + return type; +} + +static void +g_mime_decrypt_result_class_init (GMimeDecryptResultClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + result_parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_decrypt_result_finalize; +} + +static void +g_mime_decrypt_result_init (GMimeDecryptResult *result, GMimeDecryptResultClass *klass) +{ + result->cipher = GMIME_CIPHER_ALGO_DEFAULT; + result->mdc = GMIME_DIGEST_ALGO_DEFAULT; + result->recipients = NULL; + result->signatures = NULL; +} + +static void +g_mime_decrypt_result_finalize (GObject *object) +{ + GMimeDecryptResult *result = (GMimeDecryptResult *) object; + + if (result->recipients) + g_object_unref (result->recipients); + + if (result->signatures) + g_object_unref (result->signatures); + + G_OBJECT_CLASS (result_parent_class)->finalize (object); +} + + +/** + * g_mime_decrypt_result_new: + * + * Creates a new #GMimeDecryptResult object. + * + * Returns: a new #GMimeDecryptResult object. + **/ +GMimeDecryptResult * +g_mime_decrypt_result_new (void) +{ + return g_object_newv (GMIME_TYPE_DECRYPT_RESULT, 0, NULL); +} + + +/** + * g_mime_decrypt_result_set_recipients: + * @result: A #GMimeDecryptResult + * @recipients: A #GMimeCertificateList + * + * Sets the list of certificates that the stream had been encrypted to. + **/ +void +g_mime_decrypt_result_set_recipients (GMimeDecryptResult *result, GMimeCertificateList *recipients) +{ + g_return_if_fail (GMIME_IS_DECRYPT_RESULT (result)); + g_return_if_fail (GMIME_IS_CERTIFICATE_LIST (recipients)); + + if (result->recipients == recipients) + return; + + if (result->recipients) + g_object_unref (result->recipients); + + if (recipients) + g_object_ref (recipients); + + result->recipients = recipients; +} + + +/** + * g_mime_decrypt_result_get_recipients: + * @result: A #GMimeDecryptResult + * + * Gets the list of certificates that the stream had been encrypted to. + * + * Returns: a #GMimeCertificateList. + **/ +GMimeCertificateList * +g_mime_decrypt_result_get_recipients (GMimeDecryptResult *result) +{ + g_return_val_if_fail (GMIME_IS_DECRYPT_RESULT (result), NULL); + + return result->recipients; +} + + +/** + * g_mime_decrypt_result_set_signatures: + * @result: A #GMimeDecryptResult + * @signatures: A #GMimeSignatureList + * + * Sets the list of signatures. + **/ +void +g_mime_decrypt_result_set_signatures (GMimeDecryptResult *result, GMimeSignatureList *signatures) +{ + g_return_if_fail (GMIME_IS_DECRYPT_RESULT (result)); + g_return_if_fail (GMIME_IS_SIGNATURE_LIST (signatures)); + + if (result->signatures == signatures) + return; + + if (result->signatures) + g_object_unref (result->signatures); + + if (signatures) + g_object_ref (signatures); + + result->signatures = signatures; +} + + +/** + * g_mime_decrypt_result_get_signatures: + * @result: A #GMimeDecryptResult + * + * Gets a list of signatures if the encrypted stream had also been signed. + * + * Returns: a #GMimeSignatureList or %NULL if the stream was not signed. + **/ +GMimeSignatureList * +g_mime_decrypt_result_get_signatures (GMimeDecryptResult *result) +{ + g_return_val_if_fail (GMIME_IS_DECRYPT_RESULT (result), NULL); + + return result->signatures; +} + + +/** + * g_mime_decrypt_result_set_cipher: + * @result: a #GMimeDecryptResult + * @cipher: a #GMimeCipherAlgo + * + * Set the cipher algorithm used. + **/ +void +g_mime_decrypt_result_set_cipher (GMimeDecryptResult *result, GMimeCipherAlgo cipher) +{ + g_return_if_fail (GMIME_IS_DECRYPT_RESULT (result)); + + result->cipher = cipher; +} + + +/** + * g_mime_decrypt_result_get_cipher: + * @result: a #GMimeDecryptResult + * + * Get the cipher algorithm used. + * + * Returns: the cipher algorithm used. + **/ +GMimeCipherAlgo +g_mime_decrypt_result_get_cipher (GMimeDecryptResult *result) +{ + g_return_val_if_fail (GMIME_IS_DECRYPT_RESULT (result), GMIME_CIPHER_ALGO_DEFAULT); + + return result->cipher; +} + + +/** + * g_mime_decrypt_result_set_mdc: + * @result: a #GMimeDecryptResult + * @mdc: a #GMimeDigestAlgo + * + * Set the mdc digest algorithm used. + **/ +void +g_mime_decrypt_result_set_mdc (GMimeDecryptResult *result, GMimeDigestAlgo mdc) +{ + g_return_if_fail (GMIME_IS_DECRYPT_RESULT (result)); + + result->mdc = mdc; +} + + +/** + * g_mime_decrypt_result_get_mdc: + * @result: a #GMimeDecryptResult + * + * Get the mdc digest algorithm used. + * + * Returns: the mdc digest algorithm used. + **/ +GMimeDigestAlgo +g_mime_decryption_result_get_mdc (GMimeDecryptResult *result) +{ + g_return_val_if_fail (GMIME_IS_DECRYPT_RESULT (result), GMIME_DIGEST_ALGO_DEFAULT); + + return result->mdc; +} diff --git a/gmime/gmime-crypto-context.h b/gmime/gmime-crypto-context.h new file mode 100644 index 0000000..07ca9a1 --- /dev/null +++ b/gmime/gmime-crypto-context.h @@ -0,0 +1,234 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_CRYPTO_CONTEXT_H__ +#define __GMIME_CRYPTO_CONTEXT_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_CRYPTO_CONTEXT (g_mime_crypto_context_get_type ()) +#define GMIME_CRYPTO_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_CRYPTO_CONTEXT, GMimeCryptoContext)) +#define GMIME_CRYPTO_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_CRYPTO_CONTEXT, GMimeCryptoContextClass)) +#define GMIME_IS_CRYPTO_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_CRYPTO_CONTEXT)) +#define GMIME_IS_CRYPTO_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_CRYPTO_CONTEXT)) +#define GMIME_CRYPTO_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_CRYPTO_CONTEXT, GMimeCryptoContextClass)) + +#define GMIME_TYPE_DECRYPT_RESULT (g_mime_decrypt_result_get_type ()) +#define GMIME_DECRYPT_RESULT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_DECRYPT_RESULT, GMimeDecryptResult)) +#define GMIME_DECRYPT_RESULT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_DECRYPT_RESULT, GMimeDecryptResultClass)) +#define GMIME_IS_DECRYPT_RESULT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_DECRYPT_RESULT)) +#define GMIME_IS_DECRYPT_RESULT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_DECRYPT_RESULT)) +#define GMIME_DECRYPT_RESULT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_DECRYPT_RESULT, GMimeDecryptResultClass)) + +typedef struct _GMimeCryptoContext GMimeCryptoContext; +typedef struct _GMimeCryptoContextClass GMimeCryptoContextClass; + +typedef struct _GMimeDecryptResult GMimeDecryptResult; +typedef struct _GMimeDecryptResultClass GMimeDecryptResultClass; + + +/** + * GMimePasswordRequestFunc: + * @ctx: the #GMimeCryptoContext making the request + * @user_id: the user_id of the password being requested + * @prompt_ctx: a string containing some helpful context for the prompt + * @reprompt: %TRUE if this password request is a reprompt due to a previously bad password response + * @response: a stream for the application to write the password to (followed by a newline '\n' character) + * @err: a #GError for the callback to set if an error occurs + * + * A password request callback allowing a #GMimeCryptoContext to + * prompt the user for a password for a given key. + * + * Returns: %TRUE on success or %FALSE on error. + **/ +typedef gboolean (* GMimePasswordRequestFunc) (GMimeCryptoContext *ctx, const char *user_id, const char *prompt_ctx, + gboolean reprompt, GMimeStream *response, GError **err); + + +/** + * GMimeCryptoContext: + * @parent_object: parent #GObject + * @request_passwd: a callback for requesting a password + * + * A crypto context for use with MIME. + **/ +struct _GMimeCryptoContext { + GObject parent_object; + + GMimePasswordRequestFunc request_passwd; +}; + +struct _GMimeCryptoContextClass { + GObjectClass parent_class; + + GMimeDigestAlgo (* digest_id) (GMimeCryptoContext *ctx, const char *name); + + const char * (* digest_name) (GMimeCryptoContext *ctx, GMimeDigestAlgo digest); + + const char * (* get_signature_protocol) (GMimeCryptoContext *ctx); + + const char * (* get_encryption_protocol) (GMimeCryptoContext *ctx); + + const char * (* get_key_exchange_protocol) (GMimeCryptoContext *ctx); + + int (* sign) (GMimeCryptoContext *ctx, const char *userid, + GMimeDigestAlgo digest, GMimeStream *istream, + GMimeStream *ostream, GError **err); + + GMimeSignatureList * (* verify) (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *sigstream, + GError **err); + + int (* encrypt) (GMimeCryptoContext *ctx, gboolean sign, + const char *userid, GMimeDigestAlgo digest, + GPtrArray *recipients, GMimeStream *istream, + GMimeStream *ostream, GError **err); + + GMimeDecryptResult * (* decrypt) (GMimeCryptoContext *ctx, GMimeStream *istream, + GMimeStream *ostream, GError **err); + + int (* import_keys) (GMimeCryptoContext *ctx, GMimeStream *istream, + GError **err); + + int (* export_keys) (GMimeCryptoContext *ctx, GPtrArray *keys, + GMimeStream *ostream, GError **err); +}; + + +GType g_mime_crypto_context_get_type (void); + +void g_mime_crypto_context_set_request_password (GMimeCryptoContext *ctx, GMimePasswordRequestFunc request_passwd); + +/* digest algo mapping */ +GMimeDigestAlgo g_mime_crypto_context_digest_id (GMimeCryptoContext *ctx, const char *name); + +const char *g_mime_crypto_context_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest); + +/* protocol routines */ +const char *g_mime_crypto_context_get_signature_protocol (GMimeCryptoContext *ctx); + +const char *g_mime_crypto_context_get_encryption_protocol (GMimeCryptoContext *ctx); + +const char *g_mime_crypto_context_get_key_exchange_protocol (GMimeCryptoContext *ctx); + +/* crypto routines */ +int g_mime_crypto_context_sign (GMimeCryptoContext *ctx, const char *userid, + GMimeDigestAlgo digest, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +GMimeSignatureList *g_mime_crypto_context_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *sigstream, + GError **err); + +int g_mime_crypto_context_encrypt (GMimeCryptoContext *ctx, gboolean sign, + const char *userid, GMimeDigestAlgo digest, + GPtrArray *recipients, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +GMimeDecryptResult *g_mime_crypto_context_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +/* key/certificate routines */ +int g_mime_crypto_context_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, GError **err); + +int g_mime_crypto_context_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, + GMimeStream *ostream, GError **err); + + + +/** + * GMimeCipherAlgo: + * @GMIME_CIPHER_ALGO_DEFAULT: The default (or unknown) cipher. + * @GMIME_CIPHER_ALGO_IDEA: The IDEA cipher. + * @GMIME_CIPHER_ALGO_3DES: The 3DES cipher. + * @GMIME_CIPHER_ALGO_CAST5: The CAST5 cipher. + * @GMIME_CIPHER_ALGO_BLOWFISH: The Blowfish cipher. + * @GMIME_CIPHER_ALGO_AES: The AES (aka RIJANDALE) cipher. + * @GMIME_CIPHER_ALGO_AES192: The AES-192 cipher. + * @GMIME_CIPHER_ALGO_AES256: The AES-256 cipher. + * @GMIME_CIPHER_ALGO_TWOFISH: The Twofish cipher. + * @GMIME_CIPHER_ALGO_CAMELLIA128: The Camellia-128 cipher. + * @GMIME_CIPHER_ALGO_CAMELLIA192: The Camellia-192 cipher. + * @GMIME_CIPHER_ALGO_CAMELLIA256: The Camellia-256 cipher. + * + * A cipher algorithm. + **/ +typedef enum { + GMIME_CIPHER_ALGO_DEFAULT = 0, + GMIME_CIPHER_ALGO_IDEA = 1, + GMIME_CIPHER_ALGO_3DES = 2, + GMIME_CIPHER_ALGO_CAST5 = 3, + GMIME_CIPHER_ALGO_BLOWFISH = 4, + GMIME_CIPHER_ALGO_AES = 7, + GMIME_CIPHER_ALGO_AES192 = 8, + GMIME_CIPHER_ALGO_AES256 = 9, + GMIME_CIPHER_ALGO_TWOFISH = 10, + GMIME_CIPHER_ALGO_CAMELLIA128 = 11, + GMIME_CIPHER_ALGO_CAMELLIA192 = 12, + GMIME_CIPHER_ALGO_CAMELLIA256 = 13 +} GMimeCipherAlgo; + +/** + * GMimeDecryptResult: + * @parent_object: parent #GObject + * @recipients: A #GMimeCertificateList + * @signatures: A #GMimeSignatureList if signed or %NULL otherwise. + * @cipher: The cipher algorithm used to encrypt the stream. + * @mdc: The MDC digest algorithm used, if any. + * + * An object containing the results from decrypting an encrypted stream. + **/ +struct _GMimeDecryptResult { + GObject parent_object; + + GMimeCertificateList *recipients; + GMimeSignatureList *signatures; + GMimeCipherAlgo cipher; + GMimeDigestAlgo mdc; +}; + +struct _GMimeDecryptResultClass { + GObjectClass parent_class; + +}; + +GType g_mime_decrypt_result_get_type (void); + +GMimeDecryptResult *g_mime_decrypt_result_new (void); + +void g_mime_decrypt_result_set_recipients (GMimeDecryptResult *result, GMimeCertificateList *recipients); +GMimeCertificateList *g_mime_decrypt_result_get_recipients (GMimeDecryptResult *result); + +void g_mime_decrypt_result_set_signatures (GMimeDecryptResult *result, GMimeSignatureList *signatures); +GMimeSignatureList *g_mime_decrypt_result_get_signatures (GMimeDecryptResult *result); + +void g_mime_decrypt_result_set_cipher (GMimeDecryptResult *result, GMimeCipherAlgo cipher); +GMimeCipherAlgo g_mime_decrypt_result_get_cipher (GMimeDecryptResult *result); + +void g_mime_decrypt_result_set_mdc (GMimeDecryptResult *result, GMimeDigestAlgo mdc); +GMimeDigestAlgo g_mime_decrypt_result_get_mdc (GMimeDecryptResult *result); + +G_END_DECLS + +#endif /* __GMIME_CRYPTO_CONTEXT_H__ */ diff --git a/gmime/gmime-data-wrapper.c b/gmime/gmime-data-wrapper.c new file mode 100644 index 0000000..bbd4101 --- /dev/null +++ b/gmime/gmime-data-wrapper.c @@ -0,0 +1,281 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gmime-data-wrapper.h" +#include "gmime-stream-filter.h" +#include "gmime-filter-basic.h" + + +/** + * SECTION: gmime-data-wrapper + * @title: GMimeDataWrapper + * @short_description: Content objects + * @see_also: #GMimePart + * + * A #GMimeDataWrapper is a wrapper object for a #GMimePart's body, + * allowing clients to read the content from the backing stream + * without having to know whether it is encoded/compressed/etc and not + * neding to know how to undo said encoding(s). + **/ + + +static void g_mime_data_wrapper_class_init (GMimeDataWrapperClass *klass); +static void g_mime_data_wrapper_init (GMimeDataWrapper *wrapper, GMimeDataWrapperClass *klass); +static void g_mime_data_wrapper_finalize (GObject *object); + +static ssize_t write_to_stream (GMimeDataWrapper *wrapper, GMimeStream *stream); + + +static GObject *parent_class = NULL; + + +GType +g_mime_data_wrapper_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeDataWrapperClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_data_wrapper_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeDataWrapper), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_data_wrapper_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeDataWrapper", &info, 0); + } + + return type; +} + + +static void +g_mime_data_wrapper_class_init (GMimeDataWrapperClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_data_wrapper_finalize; + + klass->write_to_stream = write_to_stream; +} + +static void +g_mime_data_wrapper_init (GMimeDataWrapper *wrapper, GMimeDataWrapperClass *klass) +{ + wrapper->encoding = GMIME_CONTENT_ENCODING_DEFAULT; + wrapper->stream = NULL; +} + +static void +g_mime_data_wrapper_finalize (GObject *object) +{ + GMimeDataWrapper *wrapper = (GMimeDataWrapper *) object; + + if (wrapper->stream) + g_object_unref (wrapper->stream); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +/** + * g_mime_data_wrapper_new: + * + * Creates a new #GMimeDataWrapper object. + * + * Returns: a new data wrapper object. + **/ +GMimeDataWrapper * +g_mime_data_wrapper_new (void) +{ + return g_object_newv (GMIME_TYPE_DATA_WRAPPER, 0, NULL); +} + + +/** + * g_mime_data_wrapper_new_with_stream: + * @stream: a #GMimeStream + * @encoding: stream's encoding + * + * Creates a new #GMimeDataWrapper object around @stream. + * + * Returns: a data wrapper around @stream. Since the wrapper owns its + * own reference on the stream, caller is responsible for unrefing + * its own copy. + **/ +GMimeDataWrapper * +g_mime_data_wrapper_new_with_stream (GMimeStream *stream, GMimeContentEncoding encoding) +{ + GMimeDataWrapper *wrapper; + + g_return_val_if_fail (GMIME_IS_STREAM (stream), NULL); + + wrapper = g_mime_data_wrapper_new (); + wrapper->encoding = encoding; + wrapper->stream = stream; + + if (stream) + g_object_ref (stream); + + return wrapper; +} + + +/** + * g_mime_data_wrapper_set_stream: + * @wrapper: a #GMimeDataWrapper + * @stream: a #GMimeStream + * + * Replaces the wrapper's internal stream with @stream. Don't forget, + * if @stream is not of the same encoding as the old stream, you'll + * want to call g_mime_data_wrapper_set_encoding() as well. + * + * Note: caller is responsible for its own reference on + * @stream. + **/ +void +g_mime_data_wrapper_set_stream (GMimeDataWrapper *wrapper, GMimeStream *stream) +{ + g_return_if_fail (GMIME_IS_DATA_WRAPPER (wrapper)); + g_return_if_fail (GMIME_IS_STREAM (stream)); + + if (stream) + g_object_ref (stream); + + if (wrapper->stream) + g_object_unref (wrapper->stream); + + wrapper->stream = stream; +} + + +/** + * g_mime_data_wrapper_get_stream: + * @wrapper: a #GMimeDataWrapper + * + * Gets a reference to the stream wrapped by @wrapper. + * + * Returns: a reference to the internal stream. + **/ +GMimeStream * +g_mime_data_wrapper_get_stream (GMimeDataWrapper *wrapper) +{ + g_return_val_if_fail (GMIME_IS_DATA_WRAPPER (wrapper), NULL); + + return wrapper->stream; +} + + +/** + * g_mime_data_wrapper_set_encoding: + * @wrapper: a #GMimeDataWrapper + * @encoding: encoding + * + * Sets the encoding type of the internal stream. + **/ +void +g_mime_data_wrapper_set_encoding (GMimeDataWrapper *wrapper, GMimeContentEncoding encoding) +{ + g_return_if_fail (GMIME_IS_DATA_WRAPPER (wrapper)); + + wrapper->encoding = encoding; +} + + +/** + * g_mime_data_wrapper_get_encoding: + * @wrapper: a #GMimeDataWrapper + * + * Gets the encoding type of the stream wrapped by @wrapper. + * + * Returns: the encoding type of the internal stream. + **/ +GMimeContentEncoding +g_mime_data_wrapper_get_encoding (GMimeDataWrapper *wrapper) +{ + g_return_val_if_fail (GMIME_IS_DATA_WRAPPER (wrapper), GMIME_CONTENT_ENCODING_DEFAULT); + + return wrapper->encoding; +} + + +static ssize_t +write_to_stream (GMimeDataWrapper *wrapper, GMimeStream *stream) +{ + GMimeStream *filtered_stream; + GMimeFilter *filter; + ssize_t written; + + g_mime_stream_reset (wrapper->stream); + + switch (wrapper->encoding) { + case GMIME_CONTENT_ENCODING_BASE64: + case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: + case GMIME_CONTENT_ENCODING_UUENCODE: + filter = g_mime_filter_basic_new (wrapper->encoding, FALSE); + filtered_stream = g_mime_stream_filter_new (wrapper->stream); + g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), filter); + g_object_unref (filter); + break; + default: + filtered_stream = wrapper->stream; + g_object_ref (wrapper->stream); + break; + } + + written = g_mime_stream_write_to_stream (filtered_stream, stream); + g_object_unref (filtered_stream); + + g_mime_stream_reset (wrapper->stream); + + return written; +} + + +/** + * g_mime_data_wrapper_write_to_stream: + * @wrapper: a #GMimeDataWrapper + * @stream: output stream + * + * Writes the raw (decoded) data to the output stream. + * + * Returns: the number of bytes written or %-1 on failure. + **/ +ssize_t +g_mime_data_wrapper_write_to_stream (GMimeDataWrapper *wrapper, GMimeStream *stream) +{ + g_return_val_if_fail (GMIME_IS_DATA_WRAPPER (wrapper), -1); + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + g_return_val_if_fail (wrapper->stream != NULL, -1); + + return GMIME_DATA_WRAPPER_GET_CLASS (wrapper)->write_to_stream (wrapper, stream); +} diff --git a/gmime/gmime-data-wrapper.h b/gmime/gmime-data-wrapper.h new file mode 100644 index 0000000..d4f6a02 --- /dev/null +++ b/gmime/gmime-data-wrapper.h @@ -0,0 +1,83 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_DATA_WRAPPER_H__ +#define __GMIME_DATA_WRAPPER_H__ + +#include +#include + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_DATA_WRAPPER (g_mime_data_wrapper_get_type ()) +#define GMIME_DATA_WRAPPER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_DATA_WRAPPER, GMimeDataWrapper)) +#define GMIME_DATA_WRAPPER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_DATA_WRAPPER, GMimeDataWrapperClass)) +#define GMIME_IS_DATA_WRAPPER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_DATA_WRAPPER)) +#define GMIME_IS_DATA_WRAPPER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_DATA_WRAPPER)) +#define GMIME_DATA_WRAPPER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_DATA_WRAPPER, GMimeDataWrapperClass)) + +typedef struct _GMimeDataWrapper GMimeDataWrapper; +typedef struct _GMimeDataWrapperClass GMimeDataWrapperClass; + + +/** + * GMimeDataWrapper: + * @parent_object: parent #GObject + * @encoding: the encoding of the content + * @stream: content stream + * + * A wrapper for a stream which may be encoded. + **/ +struct _GMimeDataWrapper { + GObject parent_object; + + GMimeContentEncoding encoding; + GMimeStream *stream; +}; + +struct _GMimeDataWrapperClass { + GObjectClass parent_class; + + ssize_t (* write_to_stream) (GMimeDataWrapper *wrapper, GMimeStream *stream); +}; + + +GType g_mime_data_wrapper_get_type (void); + +GMimeDataWrapper *g_mime_data_wrapper_new (void); +GMimeDataWrapper *g_mime_data_wrapper_new_with_stream (GMimeStream *stream, GMimeContentEncoding encoding); + +void g_mime_data_wrapper_set_stream (GMimeDataWrapper *wrapper, GMimeStream *stream); +GMimeStream *g_mime_data_wrapper_get_stream (GMimeDataWrapper *wrapper); + +void g_mime_data_wrapper_set_encoding (GMimeDataWrapper *wrapper, GMimeContentEncoding encoding); +GMimeContentEncoding g_mime_data_wrapper_get_encoding (GMimeDataWrapper *wrapper); + +ssize_t g_mime_data_wrapper_write_to_stream (GMimeDataWrapper *wrapper, GMimeStream *stream); + +G_END_DECLS + +#endif /* __GMIME_DATA_WRAPPER_H__ */ diff --git a/gmime/gmime-disposition.c b/gmime/gmime-disposition.c new file mode 100644 index 0000000..4d5e9fd --- /dev/null +++ b/gmime/gmime-disposition.c @@ -0,0 +1,346 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gmime-common.h" +#include "gmime-disposition.h" +#include "gmime-events.h" + + +/** + * SECTION: gmime-disposition + * @title: GMimeContentDisposition + * @short_description: Content-Disposition fields + * @see_also: + * + * A #GMimeContentDisposition represents the pre-parsed contents of a + * Content-Disposition header field. + **/ + + +static void g_mime_content_disposition_class_init (GMimeContentDispositionClass *klass); +static void g_mime_content_disposition_init (GMimeContentDisposition *disposition, GMimeContentDispositionClass *klass); +static void g_mime_content_disposition_finalize (GObject *object); + + +static GObjectClass *parent_class = NULL; + + +GType +g_mime_content_disposition_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeContentDispositionClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_content_disposition_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeContentDisposition), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_content_disposition_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeContentDisposition", &info, 0); + } + + return type; +} + + +static void +g_mime_content_disposition_class_init (GMimeContentDispositionClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_content_disposition_finalize; +} + +static void +g_mime_content_disposition_init (GMimeContentDisposition *disposition, GMimeContentDispositionClass *klass) +{ + disposition->param_hash = g_hash_table_new (g_mime_strcase_hash, g_mime_strcase_equal); + disposition->priv = g_mime_event_new ((GObject *) disposition); + disposition->disposition = NULL; + disposition->params = NULL; +} + +static void +g_mime_content_disposition_finalize (GObject *object) +{ + GMimeContentDisposition *disposition = (GMimeContentDisposition *) object; + + g_hash_table_destroy (disposition->param_hash); + g_mime_param_destroy (disposition->params); + g_mime_event_destroy (disposition->priv); + g_free (disposition->disposition); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +/** + * g_mime_content_disposition_new: + * + * Creates a new #GMimeContentDisposition object. + * + * Returns: a new #GMimeContentDisposition object. + **/ +GMimeContentDisposition * +g_mime_content_disposition_new (void) +{ + GMimeContentDisposition *disposition; + + disposition = g_object_newv (GMIME_TYPE_CONTENT_DISPOSITION, 0, NULL); + disposition->disposition = g_strdup (GMIME_DISPOSITION_ATTACHMENT); + + return disposition; +} + + +/** + * g_mime_content_disposition_new_from_string: + * @str: Content-Disposition field value or %NULL + * + * Creates a new #GMimeContentDisposition object. + * + * Returns: a new #GMimeContentDisposition object. + **/ +GMimeContentDisposition * +g_mime_content_disposition_new_from_string (const char *str) +{ + GMimeContentDisposition *disposition; + const char *inptr = str; + GMimeParam *param; + char *value; + + if (str == NULL) + return g_mime_content_disposition_new (); + + disposition = g_object_newv (GMIME_TYPE_CONTENT_DISPOSITION, 0, NULL); + + /* get content disposition part */ + + /* find ; or \0 */ + while (*inptr && *inptr != ';') + inptr++; + + value = g_strndup (str, (size_t) (inptr - str)); + disposition->disposition = g_strstrip (value); + + /* parse the parameters, if any */ + if (*inptr++ == ';' && *inptr) { + param = disposition->params = g_mime_param_new_from_string (inptr); + + while (param) { + g_hash_table_insert (disposition->param_hash, param->name, param); + param = param->next; + } + } + + return disposition; +} + + +/** + * g_mime_content_disposition_set_disposition: + * @disposition: a #GMimeContentDisposition object + * @value: disposition value + * + * Sets the disposition to @value which may be one of + * #GMIME_DISPOSITION_ATTACHMENT or #GMIME_DISPOSITION_INLINE or, by + * your choice, any other string which would indicate how the MIME + * part should be displayed by the MUA. + **/ +void +g_mime_content_disposition_set_disposition (GMimeContentDisposition *disposition, const char *value) +{ + char *buf; + + g_return_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition)); + g_return_if_fail (value != NULL); + + buf = g_strdup (value); + g_free (disposition->disposition); + disposition->disposition = buf; + + g_mime_event_emit (disposition->priv, NULL); +} + + +/** + * g_mime_content_disposition_get_disposition: + * @disposition: a #GMimeContentDisposition object + * + * Gets the disposition or %NULL on fail. + * + * Returns: the disposition string which is probably one of + * #GMIME_DISPOSITION_ATTACHMENT or #GMIME_DISPOSITION_INLINE. + **/ +const char * +g_mime_content_disposition_get_disposition (GMimeContentDisposition *disposition) +{ + g_return_val_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition), NULL); + + return disposition->disposition; +} + + +/** + * g_mime_content_disposition_set_params: + * @disposition: a #GMimeContentDisposition object + * @params: a list of #GMimeParam objects + * + * Sets the Content-Disposition's parameter list. + **/ +void +g_mime_content_disposition_set_params (GMimeContentDisposition *disposition, GMimeParam *params) +{ + g_return_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition)); + + /* destroy the current list/hash */ + g_hash_table_remove_all (disposition->param_hash); + g_mime_param_destroy (disposition->params); + disposition->params = params; + + while (params != NULL) { + g_hash_table_insert (disposition->param_hash, params->name, params); + params = params->next; + } + + g_mime_event_emit (disposition->priv, NULL); +} + + +/** + * g_mime_content_disposition_get_params: + * @disposition: a #GMimeContentDisposition object + * + * Gets the Content-Disposition parameter list. + * + * Returns: the list of #GMimeParam's set on @disposition. + **/ +const GMimeParam * +g_mime_content_disposition_get_params (GMimeContentDisposition *disposition) +{ + g_return_val_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition), NULL); + + return disposition->params; +} + + +/** + * g_mime_content_disposition_set_parameter: + * @disposition: a #GMimeContentDisposition object + * @attribute: parameter name + * @value: parameter value + * + * Sets a parameter on the Content-Disposition. + **/ +void +g_mime_content_disposition_set_parameter (GMimeContentDisposition *disposition, const char *attribute, const char *value) +{ + GMimeParam *param = NULL; + + g_return_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition)); + g_return_if_fail (attribute != NULL); + g_return_if_fail (value != NULL); + + if ((param = g_hash_table_lookup (disposition->param_hash, attribute))) { + g_free (param->value); + param->value = g_strdup (value); + } else { + param = g_mime_param_new (attribute, value); + disposition->params = g_mime_param_append_param (disposition->params, param); + g_hash_table_insert (disposition->param_hash, param->name, param); + } + + g_mime_event_emit (disposition->priv, NULL); +} + + +/** + * g_mime_content_disposition_get_parameter: + * @disposition: a #GMimeContentDisposition object + * @attribute: parameter name + * + * Gets the value of the parameter @attribute, or %NULL on fail. + * + * Returns: the value of the parameter of name @attribute. + **/ +const char * +g_mime_content_disposition_get_parameter (GMimeContentDisposition *disposition, const char *attribute) +{ + GMimeParam *param; + + g_return_val_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition), NULL); + g_return_val_if_fail (attribute != NULL, NULL); + + if (!(param = g_hash_table_lookup (disposition->param_hash, attribute))) + return NULL; + + return param->value; +} + + +/** + * g_mime_content_disposition_to_string: + * @disposition: a #GMimeContentDisposition object + * @fold: fold header if needed + * + * Allocates a string buffer containing the Content-Disposition header + * represented by the disposition object @disposition. + * + * Returns: a string containing the disposition header + **/ +char * +g_mime_content_disposition_to_string (GMimeContentDisposition *disposition, gboolean fold) +{ + GString *string; + char *header, *buf; + + g_return_val_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition), NULL); + + /* we need to have this so wrapping is correct */ + string = g_string_new ("Content-Disposition: "); + + g_string_append (string, disposition->disposition); + g_mime_param_write_to_string (disposition->params, fold, string); + + header = string->str; + g_string_free (string, FALSE); + + buf = header + strlen ("Content-Disposition: "); + memmove (header, buf, strlen (buf) + 1); + + return header; +} diff --git a/gmime/gmime-disposition.h b/gmime/gmime-disposition.h new file mode 100644 index 0000000..21a9a04 --- /dev/null +++ b/gmime/gmime-disposition.h @@ -0,0 +1,104 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_DISPOSITION_H__ +#define __GMIME_DISPOSITION_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_CONTENT_DISPOSITION (g_mime_content_disposition_get_type ()) +#define GMIME_CONTENT_DISPOSITION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), g_mime_content_disposition_get_type (), GMimeContentDisposition)) +#define GMIME_CONTENT_DISPOSITION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), g_mime_content_disposition_get_type (), GMimeContentDispositionClass)) +#define GMIME_IS_CONTENT_DISPOSITION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), g_mime_content_disposition_get_type ())) +#define GMIME_IS_CONTENT_DISPOSITION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), g_mime_content_disposition_get_type ())) +#define GMIME_CONTENT_DISPOSITION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), g_mime_content_disposition_get_type (), GMimeContentDispositionClass)) + +typedef struct _GMimeContentDisposition GMimeContentDisposition; +typedef struct _GMimeContentDispositionClass GMimeContentDispositionClass; + +/** + * GMIME_DISPOSITION_ATTACHMENT: + * + * Standard attachment disposition. + **/ +#define GMIME_DISPOSITION_ATTACHMENT "attachment" + + +/** + * GMIME_DISPOSITION_INLINE: + * + * Standard inline disposition. + **/ +#define GMIME_DISPOSITION_INLINE "inline" + + +/** + * GMimeContentDisposition: + * @parent_object: parent #GObject + * @param_hash: parameter hash table keyed by param name + * @params: a #GMimeParam list + * @disposition: disposition + * + * A data structure representing a Content-Disposition. + **/ +struct _GMimeContentDisposition { + GObject parent_object; + + GHashTable *param_hash; + GMimeParam *params; + + gpointer priv; + + char *disposition; +}; + +struct _GMimeContentDispositionClass { + GObjectClass parent_class; + +}; + +GType g_mime_content_disposition_get_type (void); + + +GMimeContentDisposition *g_mime_content_disposition_new (void); +GMimeContentDisposition *g_mime_content_disposition_new_from_string (const char *str); + +void g_mime_content_disposition_set_disposition (GMimeContentDisposition *disposition, const char *value); +const char *g_mime_content_disposition_get_disposition (GMimeContentDisposition *disposition); + +void g_mime_content_disposition_set_params (GMimeContentDisposition *disposition, GMimeParam *params); +const GMimeParam *g_mime_content_disposition_get_params (GMimeContentDisposition *disposition); + +void g_mime_content_disposition_set_parameter (GMimeContentDisposition *disposition, + const char *attribute, const char *value); +const char *g_mime_content_disposition_get_parameter (GMimeContentDisposition *disposition, + const char *attribute); + +char *g_mime_content_disposition_to_string (GMimeContentDisposition *disposition, gboolean fold); + +G_END_DECLS + +#endif /* __GMIME_DISPOSITION_H__ */ diff --git a/gmime/gmime-encodings.c b/gmime/gmime-encodings.c new file mode 100644 index 0000000..d5378c2 --- /dev/null +++ b/gmime/gmime-encodings.c @@ -0,0 +1,1124 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast and Michael Zucchi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gmime-table-private.h" +#include "gmime-encodings.h" + + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + +#define d(x) + + +/** + * SECTION: gmime-encodings + * @title: gmime-encodings + * @short_description: MIME encoding functions + * @see_also: + * + * Utility functions to encode or decode MIME + * Content-Transfer-Encodings. + **/ + + +#define GMIME_UUENCODE_CHAR(c) ((c) ? (c) + ' ' : '`') +#define GMIME_UUDECODE_CHAR(c) (((c) - ' ') & 077) + +static char base64_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static unsigned char gmime_base64_rank[256] = { + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255, + 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255, + 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +}; + +static unsigned char gmime_uu_rank[256] = { + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, +}; + +static unsigned char tohex[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' +}; + + +/** + * g_mime_content_encoding_from_string: + * @str: a string representing a Content-Transfer-Encoding value + * + * Gets the appropriate #GMimeContentEncoding enumeration value based + * on the input string. + * + * Returns: the #GMimeContentEncoding specified by @str or + * #GMIME_CONTENT_ENCODING_DEFAULT on error. + **/ +GMimeContentEncoding +g_mime_content_encoding_from_string (const char *str) +{ + if (!g_ascii_strcasecmp (str, "7bit")) + return GMIME_CONTENT_ENCODING_7BIT; + else if (!g_ascii_strcasecmp (str, "8bit")) + return GMIME_CONTENT_ENCODING_8BIT; + else if (!g_ascii_strcasecmp (str, "7-bit")) + return GMIME_CONTENT_ENCODING_7BIT; + else if (!g_ascii_strcasecmp (str, "8-bit")) + return GMIME_CONTENT_ENCODING_8BIT; + else if (!g_ascii_strcasecmp (str, "binary")) + return GMIME_CONTENT_ENCODING_BINARY; + else if (!g_ascii_strcasecmp (str, "base64")) + return GMIME_CONTENT_ENCODING_BASE64; + else if (!g_ascii_strcasecmp (str, "quoted-printable")) + return GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE; + else if (!g_ascii_strcasecmp (str, "uuencode")) + return GMIME_CONTENT_ENCODING_UUENCODE; + else if (!g_ascii_strcasecmp (str, "x-uuencode")) + return GMIME_CONTENT_ENCODING_UUENCODE; + else if (!g_ascii_strcasecmp (str, "x-uue")) + return GMIME_CONTENT_ENCODING_UUENCODE; + else + return GMIME_CONTENT_ENCODING_DEFAULT; +} + + +/** + * g_mime_content_encoding_to_string: + * @encoding: a #GMimeContentEncoding + * + * Gets the string value of the content encoding. + * + * Returns: the encoding type as a string or %NULL on error. Available + * values for the encoding are: #GMIME_CONTENT_ENCODING_DEFAULT, + * #GMIME_CONTENT_ENCODING_7BIT, #GMIME_CONTENT_ENCODING_8BIT, + * #GMIME_CONTENT_ENCODING_BINARY, #GMIME_CONTENT_ENCODING_BASE64, + * #GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE and + * #GMIME_CONTENT_ENCODING_UUENCODE. + **/ +const char * +g_mime_content_encoding_to_string (GMimeContentEncoding encoding) +{ + switch (encoding) { + case GMIME_CONTENT_ENCODING_7BIT: + return "7bit"; + case GMIME_CONTENT_ENCODING_8BIT: + return "8bit"; + case GMIME_CONTENT_ENCODING_BINARY: + return "binary"; + case GMIME_CONTENT_ENCODING_BASE64: + return "base64"; + case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: + return "quoted-printable"; + case GMIME_CONTENT_ENCODING_UUENCODE: + return "x-uuencode"; + default: + /* I guess this is a good default... */ + return NULL; + } +} + + +/** + * g_mime_encoding_init_encode: + * @state: a #GMimeEncoding to initialize + * @encoding: a #GMimeContentEncoding to use + * + * Initializes a #GMimeEncoding state machine for encoding to + * @encoding. + **/ +void +g_mime_encoding_init_encode (GMimeEncoding *state, GMimeContentEncoding encoding) +{ + state->encoding = encoding; + state->encode = TRUE; + + g_mime_encoding_reset (state); +} + + +/** + * g_mime_encoding_init_decode: + * @state: a #GMimeEncoding to initialize + * @encoding: a #GMimeContentEncoding to use + * + * Initializes a #GMimeEncoding state machine for decoding from + * @encoding. + **/ +void +g_mime_encoding_init_decode (GMimeEncoding *state, GMimeContentEncoding encoding) +{ + state->encoding = encoding; + state->encode = FALSE; + + g_mime_encoding_reset (state); +} + + +/** + * g_mime_encoding_reset: + * @state: a #GMimeEncoding to reset + * + * Resets the state of the #GMimeEncoding. + **/ +void +g_mime_encoding_reset (GMimeEncoding *state) +{ + if (state->encode) { + if (state->encoding == GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE) + state->state = -1; + else + state->state = 0; + } else { + state->state = 0; + } + + state->save = 0; +} + + +/** + * g_mime_encoding_outlen: + * @state: a #GMimeEncoding + * @inlen: an input length + * + * Given the input length, @inlen, calculate the needed output length + * to perform an encoding or decoding step. + * + * Returns: the maximum number of bytes needed to encode or decode a + * buffer of @inlen bytes. + **/ +size_t +g_mime_encoding_outlen (GMimeEncoding *state, size_t inlen) +{ + switch (state->encoding) { + case GMIME_CONTENT_ENCODING_BASE64: + if (state->encode) + return GMIME_BASE64_ENCODE_LEN (inlen); + else + return inlen + 3; + case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: + if (state->encode) + return GMIME_QP_ENCODE_LEN (inlen); + else + return inlen + 2; + case GMIME_CONTENT_ENCODING_UUENCODE: + if (state->encode) + return GMIME_UUENCODE_LEN (inlen); + else + return inlen + 3; + default: + return inlen; + } +} + + +/** + * g_mime_encoding_step: + * @state: a #GMimeEncoding + * @inbuf: an input buffer to encode or decode + * @inlen: input buffer length + * @outbuf: an output buffer + * + * Incrementally encodes or decodes (depending on @state) an input + * stream by 'stepping' through a block of input at a time. + * + * You should make sure @outbuf is large enough by calling + * g_mime_encoding_outlen() to find out how large @outbuf might need + * to be. + * + * Returns: the number of bytes written to @outbuf. + **/ +size_t +g_mime_encoding_step (GMimeEncoding *state, const char *inbuf, size_t inlen, char *outbuf) +{ + const unsigned char *inptr = (const unsigned char *) inbuf; + unsigned char *outptr = (unsigned char *) outbuf; + + switch (state->encoding) { + case GMIME_CONTENT_ENCODING_BASE64: + if (state->encode) + return g_mime_encoding_base64_encode_step (inptr, inlen, outptr, &state->state, &state->save); + else + return g_mime_encoding_base64_decode_step (inptr, inlen, outptr, &state->state, &state->save); + case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: + if (state->encode) + return g_mime_encoding_quoted_encode_step (inptr, inlen, outptr, &state->state, &state->save); + else + return g_mime_encoding_quoted_decode_step (inptr, inlen, outptr, &state->state, &state->save); + case GMIME_CONTENT_ENCODING_UUENCODE: + if (state->encode) + return g_mime_encoding_uuencode_step (inptr, inlen, outptr, state->uubuf, &state->state, &state->save); + else + return g_mime_encoding_uudecode_step (inptr, inlen, outptr, &state->state, &state->save); + default: + memcpy (outbuf, inbuf, inlen); + return inlen; + } +} + + +/** + * g_mime_encoding_flush: + * @state: a #GMimeEncoding + * @inbuf: an input buffer to encode or decode + * @inlen: input buffer length + * @outbuf: an output buffer + * + * Completes the incremental encode or decode of the input stream (see + * g_mime_encoding_step() for details). + * + * Returns: the number of bytes written to @outbuf. + **/ +size_t +g_mime_encoding_flush (GMimeEncoding *state, const char *inbuf, size_t inlen, char *outbuf) +{ + const unsigned char *inptr = (const unsigned char *) inbuf; + unsigned char *outptr = (unsigned char *) outbuf; + + switch (state->encoding) { + case GMIME_CONTENT_ENCODING_BASE64: + if (state->encode) + return g_mime_encoding_base64_encode_close (inptr, inlen, outptr, &state->state, &state->save); + else + return g_mime_encoding_base64_decode_step (inptr, inlen, outptr, &state->state, &state->save); + case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: + if (state->encode) + return g_mime_encoding_quoted_encode_close (inptr, inlen, outptr, &state->state, &state->save); + else + return g_mime_encoding_quoted_decode_step (inptr, inlen, outptr, &state->state, &state->save); + case GMIME_CONTENT_ENCODING_UUENCODE: + if (state->encode) + return g_mime_encoding_uuencode_close (inptr, inlen, outptr, state->uubuf, &state->state, &state->save); + else + return g_mime_encoding_uudecode_step (inptr, inlen, outptr, &state->state, &state->save); + default: + memcpy (outbuf, inbuf, inlen); + return inlen; + } +} + + +/** + * g_mime_encoding_base64_encode_close: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @state: holds the number of bits that are stored in @save + * @save: leftover bits that have not yet been encoded + * + * Base64 encodes the input stream to the output stream. Call this + * when finished encoding data with g_mime_encoding_base64_encode_step() + * to flush off the last little bit. + * + * Returns: the number of bytes encoded. + **/ +size_t +g_mime_encoding_base64_encode_close (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save) +{ + unsigned char *outptr = outbuf; + int c1, c2; + + if (inlen > 0) + outptr += g_mime_encoding_base64_encode_step (inbuf, inlen, outptr, state, save); + + c1 = ((unsigned char *)save)[1]; + c2 = ((unsigned char *)save)[2]; + + switch (((unsigned char *)save)[0]) { + case 2: + outptr[2] = base64_alphabet [(c2 & 0x0f) << 2]; + goto skip; + case 1: + outptr[2] = '='; + skip: + outptr[0] = base64_alphabet [c1 >> 2]; + outptr[1] = base64_alphabet [c2 >> 4 | ((c1 & 0x3) << 4)]; + outptr[3] = '='; + outptr += 4; + break; + } + + *outptr++ = '\n'; + + *save = 0; + *state = 0; + + return (outptr - outbuf); +} + + +/** + * g_mime_encoding_base64_encode_step: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @state: holds the number of bits that are stored in @save + * @save: leftover bits that have not yet been encoded + * + * Base64 encodes a chunk of data. Performs an 'encode step', only + * encodes blocks of 3 characters to the output at a time, saves + * left-over state in state and save (initialise to 0 on first + * invocation). + * + * Returns: the number of bytes encoded. + **/ +size_t +g_mime_encoding_base64_encode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save) +{ + const register unsigned char *inptr; + register unsigned char *outptr; + + if (inlen == 0) + return 0; + + outptr = outbuf; + inptr = inbuf; + + if (inlen + ((unsigned char *)save)[0] > 2) { + const unsigned char *inend = inbuf + inlen - 2; + register int c1 = 0, c2 = 0, c3 = 0; + register int already; + + already = *state; + + switch (((char *)save)[0]) { + case 1: c1 = ((unsigned char *)save)[1]; goto skip1; + case 2: c1 = ((unsigned char *)save)[1]; + c2 = ((unsigned char *)save)[2]; goto skip2; + } + + /* yes, we jump into the loop, no i'm not going to change it, its beautiful! */ + while (inptr < inend) { + c1 = *inptr++; + skip1: + c2 = *inptr++; + skip2: + c3 = *inptr++; + *outptr++ = base64_alphabet [c1 >> 2]; + *outptr++ = base64_alphabet [(c2 >> 4) | ((c1 & 0x3) << 4)]; + *outptr++ = base64_alphabet [((c2 & 0x0f) << 2) | (c3 >> 6)]; + *outptr++ = base64_alphabet [c3 & 0x3f]; + /* this is a bit ugly ... */ + if ((++already) >= 19) { + *outptr++ = '\n'; + already = 0; + } + } + + ((unsigned char *)save)[0] = 0; + inlen = 2 - (inptr - inend); + *state = already; + } + + d(printf ("state = %d, inlen = %d\n", (int)((char *)save)[0], inlen)); + + if (inlen > 0) { + register char *saveout; + + /* points to the slot for the next char to save */ + saveout = & (((char *)save)[1]) + ((char *)save)[0]; + + /* inlen can only be 0, 1 or 2 */ + switch (inlen) { + case 2: *saveout++ = *inptr++; + case 1: *saveout++ = *inptr++; + } + ((char *)save)[0] += (char) inlen; + } + + d(printf ("mode = %d\nc1 = %c\nc2 = %c\n", + (int)((char *)save)[0], + (int)((char *)save)[1], + (int)((char *)save)[2])); + + return (outptr - outbuf); +} + + +/** + * g_mime_encoding_base64_decode_step: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @state: holds the number of bits that are stored in @save + * @save: leftover bits that have not yet been decoded + * + * Decodes a chunk of base64 encoded data. + * + * Returns: the number of bytes decoded (which have been dumped in + * @outbuf). + **/ +size_t +g_mime_encoding_base64_decode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save) +{ + const register unsigned char *inptr; + register unsigned char *outptr; + const unsigned char *inend; + register guint32 saved; + unsigned char c; + int npad, n, i; + + inend = inbuf + inlen; + outptr = outbuf; + inptr = inbuf; + + npad = (*state >> 8) & 0xff; + n = *state & 0xff; + saved = *save; + + /* convert 4 base64 bytes to 3 normal bytes */ + while (inptr < inend) { + c = gmime_base64_rank[*inptr++]; + if (c != 0xff) { + saved = (saved << 6) | c; + n++; + if (n == 4) { + *outptr++ = saved >> 16; + *outptr++ = saved >> 8; + *outptr++ = saved; + n = 0; + + if (npad > 0) { + outptr -= npad; + npad = 0; + } + } + } + } + + /* quickly scan back for '=' on the end somewhere */ + /* fortunately we can drop 1 output char for each trailing '=' (up to 2) */ + for (i = 2; inptr > inbuf && i; ) { + inptr--; + if (gmime_base64_rank[*inptr] != 0xff) { + if (*inptr == '=' && outptr > outbuf) { + if (n == 0) { + /* we've got a complete quartet so it's + safe to drop an output character. */ + outptr--; + } else if (npad < 2) { + /* keep a record of the number of ='s at + the end of the input stream, up to 2 */ + npad++; + } + } + + i--; + } + } + + *state = (npad << 8) | n; + *save = n ? saved : 0; + + return (outptr - outbuf); +} + + +/** + * g_mime_encoding_uuencode_close: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @uubuf: temporary buffer of 60 bytes + * @state: holds the number of bits that are stored in @save + * @save: leftover bits that have not yet been encoded + * + * Uuencodes a chunk of data. Call this when finished encoding data + * with g_mime_encoding_uuencode_step() to flush off the last little bit. + * + * Returns: the number of bytes encoded. + **/ +size_t +g_mime_encoding_uuencode_close (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, unsigned char *uubuf, int *state, guint32 *save) +{ + register unsigned char *outptr, *bufptr; + register guint32 saved; + int uulen, uufill, i; + + outptr = outbuf; + + if (inlen > 0) + outptr += g_mime_encoding_uuencode_step (inbuf, inlen, outbuf, uubuf, state, save); + + uufill = 0; + + saved = *save; + i = *state & 0xff; + uulen = (*state >> 8) & 0xff; + + bufptr = uubuf + ((uulen / 3) * 4); + + if (i > 0) { + while (i < 3) { + saved <<= 8; + uufill++; + i++; + } + + if (i == 3) { + /* convert 3 normal bytes into 4 uuencoded bytes */ + unsigned char b0, b1, b2; + + b0 = (saved >> 16) & 0xff; + b1 = (saved >> 8) & 0xff; + b2 = saved & 0xff; + + *bufptr++ = GMIME_UUENCODE_CHAR ((b0 >> 2) & 0x3f); + *bufptr++ = GMIME_UUENCODE_CHAR (((b0 << 4) | ((b1 >> 4) & 0xf)) & 0x3f); + *bufptr++ = GMIME_UUENCODE_CHAR (((b1 << 2) | ((b2 >> 6) & 0x3)) & 0x3f); + *bufptr++ = GMIME_UUENCODE_CHAR (b2 & 0x3f); + + uulen += 3; + saved = 0; + i = 0; + } + } + + if (uulen > 0) { + int cplen = ((uulen / 3) * 4); + + *outptr++ = GMIME_UUENCODE_CHAR ((uulen - uufill) & 0xff); + memcpy (outptr, uubuf, cplen); + outptr += cplen; + *outptr++ = '\n'; + uulen = 0; + } + + *outptr++ = GMIME_UUENCODE_CHAR (uulen & 0xff); + *outptr++ = '\n'; + + *save = 0; + *state = 0; + + return (outptr - outbuf); +} + + +/** + * g_mime_encoding_uuencode_step: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output stream + * @uubuf: temporary buffer of 60 bytes + * @state: holds the number of bits that are stored in @save + * @save: leftover bits that have not yet been encoded + * + * Uuencodes a chunk of data. Performs an 'encode step', only encodes + * blocks of 45 characters to the output at a time, saves left-over + * state in @uubuf, @state and @save (initialize to 0 on first + * invocation). + * + * Returns: the number of bytes encoded. + **/ +size_t +g_mime_encoding_uuencode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, unsigned char *uubuf, int *state, guint32 *save) +{ + register unsigned char *outptr, *bufptr; + const register unsigned char *inptr; + const unsigned char *inend; + unsigned char b0, b1, b2; + guint32 saved; + int uulen, i; + + if (inlen == 0) + return 0; + + inend = inbuf + inlen; + outptr = outbuf; + inptr = inbuf; + + saved = *save; + i = *state & 0xff; + uulen = (*state >> 8) & 0xff; + + if ((inlen + uulen) < 45) { + /* not enough input to write a full uuencoded line */ + bufptr = uubuf + ((uulen / 3) * 4); + } else { + bufptr = outptr + 1; + + if (uulen > 0) { + /* copy the previous call's tmpbuf to outbuf */ + memcpy (bufptr, uubuf, ((uulen / 3) * 4)); + bufptr += ((uulen / 3) * 4); + } + } + + if (i == 2) { + b0 = (saved >> 8) & 0xff; + b1 = saved & 0xff; + saved = 0; + i = 0; + + goto skip2; + } else if (i == 1) { + if ((inptr + 2) < inend) { + b0 = saved & 0xff; + saved = 0; + i = 0; + + goto skip1; + } + + while (inptr < inend) { + saved = (saved << 8) | *inptr++; + i++; + } + } + + while (inptr < inend) { + while (uulen < 45 && (inptr + 3) <= inend) { + b0 = *inptr++; + skip1: + b1 = *inptr++; + skip2: + b2 = *inptr++; + + /* convert 3 normal bytes into 4 uuencoded bytes */ + *bufptr++ = GMIME_UUENCODE_CHAR ((b0 >> 2) & 0x3f); + *bufptr++ = GMIME_UUENCODE_CHAR (((b0 << 4) | ((b1 >> 4) & 0xf)) & 0x3f); + *bufptr++ = GMIME_UUENCODE_CHAR (((b1 << 2) | ((b2 >> 6) & 0x3)) & 0x3f); + *bufptr++ = GMIME_UUENCODE_CHAR (b2 & 0x3f); + + uulen += 3; + } + + if (uulen >= 45) { + /* output the uu line length */ + *outptr = GMIME_UUENCODE_CHAR (uulen & 0xff); + outptr += ((45 / 3) * 4) + 1; + + *outptr++ = '\n'; + uulen = 0; + + if ((inptr + 45) <= inend) { + /* we have enough input to output another full line */ + bufptr = outptr + 1; + } else { + bufptr = uubuf; + } + } else { + /* not enough input to continue... */ + for (i = 0, saved = 0; inptr < inend; i++) + saved = (saved << 8) | *inptr++; + } + } + + *save = saved; + *state = ((uulen & 0xff) << 8) | (i & 0xff); + + return (outptr - outbuf); +} + + +/** + * g_mime_encoding_uudecode_step: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @state: holds the number of bits that are stored in @save + * @save: leftover bits that have not yet been decoded + * + * Uudecodes a chunk of data. Performs a 'decode step' on a chunk of + * uuencoded data. Assumes the "begin mode filename" line has + * been stripped off. + * + * Returns: the number of bytes decoded. + **/ +size_t +g_mime_encoding_uudecode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save) +{ + const register unsigned char *inptr; + register unsigned char *outptr; + const unsigned char *inend; + unsigned char ch; + register guint32 saved; + gboolean last_was_eoln; + int uulen, i; + + if (*state & GMIME_UUDECODE_STATE_END) + return 0; + + saved = *save; + i = *state & 0xff; + uulen = (*state >> 8) & 0xff; + if (uulen == 0) + last_was_eoln = TRUE; + else + last_was_eoln = FALSE; + + inend = inbuf + inlen; + outptr = outbuf; + inptr = inbuf; + + while (inptr < inend) { + if (*inptr == '\n') { + last_was_eoln = TRUE; + + inptr++; + continue; + } else if (!uulen || last_was_eoln) { + /* first octet on a line is the uulen octet */ + uulen = gmime_uu_rank[*inptr]; + last_was_eoln = FALSE; + if (uulen == 0) { + *state |= GMIME_UUDECODE_STATE_END; + break; + } + + inptr++; + continue; + } + + ch = *inptr++; + + if (uulen > 0) { + /* save the byte */ + saved = (saved << 8) | ch; + i++; + if (i == 4) { + /* convert 4 uuencoded bytes to 3 normal bytes */ + unsigned char b0, b1, b2, b3; + + b0 = saved >> 24; + b1 = saved >> 16 & 0xff; + b2 = saved >> 8 & 0xff; + b3 = saved & 0xff; + + if (uulen >= 3) { + *outptr++ = gmime_uu_rank[b0] << 2 | gmime_uu_rank[b1] >> 4; + *outptr++ = gmime_uu_rank[b1] << 4 | gmime_uu_rank[b2] >> 2; + *outptr++ = gmime_uu_rank[b2] << 6 | gmime_uu_rank[b3]; + uulen -= 3; + } else { + if (uulen >= 1) { + *outptr++ = gmime_uu_rank[b0] << 2 | gmime_uu_rank[b1] >> 4; + uulen--; + } + + if (uulen >= 1) { + *outptr++ = gmime_uu_rank[b1] << 4 | gmime_uu_rank[b2] >> 2; + uulen--; + } + } + + i = 0; + saved = 0; + } + } else { + break; + } + } + + *save = saved; + *state = (*state & GMIME_UUDECODE_STATE_MASK) | ((uulen & 0xff) << 8) | (i & 0xff); + + return (outptr - outbuf); +} + + +/** + * g_mime_encoding_quoted_encode_close: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @state: holds the number of bits that are stored in @save + * @save: leftover bits that have not yet been encoded + * + * Quoted-printable encodes a block of text. Call this when finished + * encoding data with g_mime_encoding_quoted_encode_step() to flush off + * the last little bit. + * + * Returns: the number of bytes encoded. + **/ +size_t +g_mime_encoding_quoted_encode_close (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save) +{ + register unsigned char *outptr = outbuf; + int last; + + if (inlen > 0) + outptr += g_mime_encoding_quoted_encode_step (inbuf, inlen, outptr, state, save); + + last = *state; + if (last != -1) { + /* space/tab must be encoded if its the last character on + the line */ + if (is_qpsafe (last) && !is_blank (last)) { + *outptr++ = last; + } else { + *outptr++ = '='; + *outptr++ = tohex[(last >> 4) & 0xf]; + *outptr++ = tohex[last & 0xf]; + } + } + + if (last != '\n') { + /* we end with =\n so that the \n isn't interpreted as a real + \n when it gets decoded later */ + *outptr++ = '='; + *outptr++ = '\n'; + } + + *save = 0; + *state = -1; + + return (outptr - outbuf); +} + + +/** + * g_mime_encoding_quoted_encode_step: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @state: holds the number of bits that are stored in @save + * @save: leftover bits that have not yet been encoded + * + * Quoted-printable encodes a block of text. Performs an 'encode + * step', saves left-over state in state and save (initialise to -1 on + * first invocation). + * + * Returns: the number of bytes encoded. + **/ +size_t +g_mime_encoding_quoted_encode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save) +{ + const register unsigned char *inptr = inbuf; + const unsigned char *inend = inbuf + inlen; + register unsigned char *outptr = outbuf; + register guint32 sofar = *save; /* keeps track of how many chars on a line */ + register int last = *state; /* keeps track if last char to end was a space cr etc */ + unsigned char c; + + while (inptr < inend) { + c = *inptr++; + if (c == '\r') { + if (last != -1) { + *outptr++ = '='; + *outptr++ = tohex[(last >> 4) & 0xf]; + *outptr++ = tohex[last & 0xf]; + sofar += 3; + } + last = c; + } else if (c == '\n') { + if (last != -1 && last != '\r') { + *outptr++ = '='; + *outptr++ = tohex[(last >> 4) & 0xf]; + *outptr++ = tohex[last & 0xf]; + } + *outptr++ = '\n'; + sofar = 0; + last = -1; + } else { + if (last != -1) { + if (is_qpsafe (last)) { + *outptr++ = last; + sofar++; + } else { + *outptr++ = '='; + *outptr++ = tohex[(last >> 4) & 0xf]; + *outptr++ = tohex[last & 0xf]; + sofar += 3; + } + } + + if (is_qpsafe (c)) { + if (sofar > 74) { + *outptr++ = '='; + *outptr++ = '\n'; + sofar = 0; + } + + /* delay output of space char */ + if (is_blank (c)) { + last = c; + } else { + *outptr++ = c; + sofar++; + last = -1; + } + } else { + if (sofar > 72) { + *outptr++ = '='; + *outptr++ = '\n'; + sofar = 3; + } else + sofar += 3; + + *outptr++ = '='; + *outptr++ = tohex[(c >> 4) & 0xf]; + *outptr++ = tohex[c & 0xf]; + last = -1; + } + } + } + + *save = sofar; + *state = last; + + return (outptr - outbuf); +} + + +/** + * g_mime_encoding_quoted_decode_step: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @state: holds the number of bits that are stored in @save + * @save: leftover bits that have not yet been decoded + * + * Decodes a block of quoted-printable encoded data. Performs a + * 'decode step' on a chunk of QP encoded data. + * + * Returns: the number of bytes decoded. + **/ +size_t +g_mime_encoding_quoted_decode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save) +{ + /* FIXME: this does not strip trailing spaces from lines (as + * it should, rfc 2045, section 6.7) Should it also + * canonicalise the end of line to CR LF?? + * + * Note: Trailing rubbish (at the end of input), like = or =x + * or =\r will be lost. + */ + const register unsigned char *inptr = inbuf; + const unsigned char *inend = inbuf + inlen; + register unsigned char *outptr = outbuf; + guint32 isave = *save; + int istate = *state; + unsigned char c; + + d(printf ("quoted-printable, decoding text '%.*s'\n", inlen, inbuf)); + + while (inptr < inend) { + switch (istate) { + case 0: + while (inptr < inend) { + c = *inptr++; + /* FIXME: use a specials table to avoid 3 comparisons for the common case */ + if (c == '=') { + istate = 1; + break; + } +#ifdef CANONICALISE_EOL + /*else if (c=='\r') { + state = 3; + } else if (c=='\n') { + *outptr++ = '\r'; + *outptr++ = c; + } */ +#endif + else { + *outptr++ = c; + } + } + break; + case 1: + c = *inptr++; + if (c == '\n') { + /* soft break ... unix end of line */ + istate = 0; + } else { + isave = c; + istate = 2; + } + break; + case 2: + c = *inptr++; + if (isxdigit (c) && isxdigit (isave)) { + c = toupper ((int) c); + isave = toupper ((int) isave); + *outptr++ = (((isave >= 'A' ? isave - 'A' + 10 : isave - '0') & 0x0f) << 4) + | ((c >= 'A' ? c - 'A' + 10 : c - '0') & 0x0f); + } else if (c == '\n' && isave == '\r') { + /* soft break ... canonical end of line */ + } else { + /* just output the data */ + *outptr++ = '='; + *outptr++ = isave; + *outptr++ = c; + } + istate = 0; + break; +#ifdef CANONICALISE_EOL + case 3: + /* convert \n -> to \r\n, leaves \r\n alone */ + c = *inptr++; + if (c == '\n') { + *outptr++ = '\r'; + *outptr++ = c; + } else { + *outptr++ = '\r'; + *outptr++ = '\n'; + *outptr++ = c; + } + istate = 0; + break; +#endif + } + } + + *state = istate; + *save = isave; + + return (outptr - outbuf); +} diff --git a/gmime/gmime-encodings.h b/gmime/gmime-encodings.h new file mode 100644 index 0000000..f021b42 --- /dev/null +++ b/gmime/gmime-encodings.h @@ -0,0 +1,189 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_ENCODINGS_H__ +#define __GMIME_ENCODINGS_H__ + +#include +#include + +G_BEGIN_DECLS + + +/** + * GMimeContentEncoding: + * @GMIME_CONTENT_ENCODING_DEFAULT: Default transfer encoding. + * @GMIME_CONTENT_ENCODING_7BIT: 7bit text transfer encoding. + * @GMIME_CONTENT_ENCODING_8BIT: 8bit text transfer encoding. + * @GMIME_CONTENT_ENCODING_BINARY: Binary transfer encoding. + * @GMIME_CONTENT_ENCODING_BASE64: Base64 transfer encoding. + * @GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: Quoted-printable transfer encoding. + * @GMIME_CONTENT_ENCODING_UUENCODE: Uuencode transfer encoding. + * + * A Content-Transfer-Encoding enumeration. + **/ +typedef enum { + GMIME_CONTENT_ENCODING_DEFAULT, + GMIME_CONTENT_ENCODING_7BIT, + GMIME_CONTENT_ENCODING_8BIT, + GMIME_CONTENT_ENCODING_BINARY, + GMIME_CONTENT_ENCODING_BASE64, + GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE, + GMIME_CONTENT_ENCODING_UUENCODE +} GMimeContentEncoding; + + +/** + * GMimeEncodingConstraint: + * @GMIME_ENCODING_CONSTRAINT_7BIT: The stream data must fit within the 7bit ASCII range. + * @GMIME_ENCODING_CONSTRAINT_8BIT: The stream data may have bytes with the high bit set, but no null bytes. + * @GMIME_ENCODING_CONSTRAINT_BINARY: The stream may contain any binary data. + * + * Used with functions like g_mime_filter_best_encoding() and + * g_mime_object_encode() as the 'constraint' argument. These values + * provide a means of letting the filter know what the encoding + * constraints are for the stream. + **/ +typedef enum { + GMIME_ENCODING_CONSTRAINT_7BIT, + GMIME_ENCODING_CONSTRAINT_8BIT, + GMIME_ENCODING_CONSTRAINT_BINARY +} GMimeEncodingConstraint; + + +GMimeContentEncoding g_mime_content_encoding_from_string (const char *str); +const char *g_mime_content_encoding_to_string (GMimeContentEncoding encoding); + + +/** + * GMIME_BASE64_ENCODE_LEN: + * @x: Length of the input data to encode + * + * Calculates the maximum number of bytes needed to base64 encode the + * full input buffer of length @x. + * + * Returns: the number of output bytes needed to base64 encode an input + * buffer of size @x. + **/ +#define GMIME_BASE64_ENCODE_LEN(x) ((size_t) (((((x) + 2) / 57) * 77) + 77)) + + +/** + * GMIME_QP_ENCODE_LEN: + * @x: Length of the input data to encode + * + * Calculates the maximum number of bytes needed to encode the full + * input buffer of length @x using the quoted-printable encoding. + * + * Returns: the number of output bytes needed to encode an input buffer + * of size @x using the quoted-printable encoding. + **/ +#define GMIME_QP_ENCODE_LEN(x) ((size_t) ((((x) / 24) * 74) + 74)) + + +/** + * GMIME_UUENCODE_LEN: + * @x: Length of the input data to encode + * + * Calculates the maximum number of bytes needed to uuencode the full + * input buffer of length @x. + * + * Returns: the number of output bytes needed to uuencode an input + * buffer of size @x. + **/ +#define GMIME_UUENCODE_LEN(x) ((size_t) (((((x) + 2) / 45) * 62) + 64)) + + +/** + * GMIME_UUDECODE_STATE_INIT: + * + * Initial state for the g_mime_encoding_uudecode_step() function. + **/ +#define GMIME_UUDECODE_STATE_INIT (0) + + +/** + * GMIME_UUDECODE_STATE_BEGIN: + * + * State for the g_mime_encoding_uudecode_step() function, denoting that + * the 'begin' line has been found. + **/ +#define GMIME_UUDECODE_STATE_BEGIN (1 << 16) + + +/** + * GMIME_UUDECODE_STATE_END: + * + * State for the g_mime_encoding_uudecode_step() function, denoting that + * the end of the UU encoded block has been found. + **/ +#define GMIME_UUDECODE_STATE_END (1 << 17) +#define GMIME_UUDECODE_STATE_MASK (GMIME_UUDECODE_STATE_BEGIN | GMIME_UUDECODE_STATE_END) + + +/** + * GMimeEncoding: + * @encoding: the type of encoding + * @uubuf: a temporary buffer needed when uuencoding data + * @encode: %TRUE if encoding or %FALSE if decoding + * @save: saved bytes from the previous step + * @state: current encder/decoder state + * + * A context used for encoding or decoding data. + **/ +typedef struct _GMimeEncoding { + GMimeContentEncoding encoding; + unsigned char uubuf[60]; + gboolean encode; + guint32 save; + int state; +} GMimeEncoding; + + +void g_mime_encoding_init_encode (GMimeEncoding *state, GMimeContentEncoding encoding); +void g_mime_encoding_init_decode (GMimeEncoding *state, GMimeContentEncoding encoding); +void g_mime_encoding_reset (GMimeEncoding *state); + +size_t g_mime_encoding_outlen (GMimeEncoding *state, size_t inlen); + +size_t g_mime_encoding_step (GMimeEncoding *state, const char *inbuf, size_t inlen, char *outbuf); +size_t g_mime_encoding_flush (GMimeEncoding *state, const char *inbuf, size_t inlen, char *outbuf); + + +/* do incremental base64 (de/en)coding */ +size_t g_mime_encoding_base64_decode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save); +size_t g_mime_encoding_base64_encode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save); +size_t g_mime_encoding_base64_encode_close (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save); + +/* do incremental uu (de/en)coding */ +size_t g_mime_encoding_uudecode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save); +size_t g_mime_encoding_uuencode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, unsigned char *uubuf, int *state, guint32 *save); +size_t g_mime_encoding_uuencode_close (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, unsigned char *uubuf, int *state, guint32 *save); + +/* do incremental quoted-printable (de/en)coding */ +size_t g_mime_encoding_quoted_decode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save); +size_t g_mime_encoding_quoted_encode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save); +size_t g_mime_encoding_quoted_encode_close (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, int *state, guint32 *save); + + +G_END_DECLS + +#endif /* __GMIME_ENCODINGS_H__ */ diff --git a/gmime/gmime-error.h b/gmime/gmime-error.h new file mode 100644 index 0000000..f27cc4a --- /dev/null +++ b/gmime/gmime-error.h @@ -0,0 +1,71 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_ERROR_H__ +#define __GMIME_ERROR_H__ + +#include + +G_BEGIN_DECLS + +extern GQuark gmime_error_quark; + +/** + * GMIME_ERROR: + * + * The GMime error domain GQuark value. + **/ +#define GMIME_ERROR gmime_error_quark + +/** + * GMIME_ERROR_IS_SYSTEM: + * @error: integer error value + * + * Decides if an error is a system error (aka errno value) vs. a GMime + * error. + * + * Meant to be used with #GError::code + **/ +#define GMIME_ERROR_IS_SYSTEM(error) ((error) > 0) + +/* errno is a positive value, so negative values should be safe to use */ +enum { + GMIME_ERROR_GENERAL = 0, + GMIME_ERROR_NOT_SUPPORTED = -1, + GMIME_ERROR_PARSE_ERROR = -2, + GMIME_ERROR_PROTOCOL_ERROR = -3, + GMIME_ERROR_BAD_PASSWORD = -4, + GMIME_ERROR_NO_VALID_RECIPIENTS = -5 +}; + + +extern GQuark gmime_gpgme_error_quark; + +/** + * GMIME_GPGME_ERROR: + * + * The GMime GpgMe error domain GQuark value. + **/ +#define GMIME_GPGME_ERROR gmime_gpgme_error_quark + +G_END_DECLS + +#endif /* __GMIME_ERROR_H__ */ diff --git a/gmime/gmime-events.c b/gmime/gmime-events.c new file mode 100644 index 0000000..f15f906 --- /dev/null +++ b/gmime/gmime-events.c @@ -0,0 +1,220 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gmime-events.h" +#include "list.h" + +typedef struct _EventListener { + struct _EventListener *next; + struct _EventListener *prev; + GMimeEventCallback callback; + gpointer user_data; + int blocked; +} EventListener; + +static EventListener * +event_listener_new (GMimeEventCallback callback, gpointer user_data) +{ + EventListener *listener; + + listener = g_slice_new (EventListener); + listener->user_data = user_data; + listener->callback = callback; + listener->prev = NULL; + listener->next = NULL; + listener->blocked = 0; + + return listener; +} + +static void +event_listener_free (EventListener *listener) +{ + g_slice_free (EventListener, listener); +} + + +struct _GMimeEvent { + gpointer owner; + List list; +}; + + +/** + * g_mime_event_new: + * @owner: a pointer to the object owning this event + * + * Creates a new #GMimeEvent context. + * + * Returns: a newly allocated #GMimeEvent context. + **/ +GMimeEvent * +g_mime_event_new (gpointer owner) +{ + GMimeEvent *event; + + event = g_slice_new (GMimeEvent); + list_init (&event->list); + event->owner = owner; + + return event; +} + + +/** + * g_mime_event_destroy: + * @event: a #GMimeEvent + * + * Destroys an event context. + **/ +void +g_mime_event_destroy (GMimeEvent *event) +{ + EventListener *node, *next; + + node = (EventListener *) event->list.head; + while (node->next) { + next = node->next; + event_listener_free (node); + node = next; + } + + g_slice_free (GMimeEvent, event); +} + + +static EventListener * +g_mime_event_find_listener (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data) +{ + EventListener *node; + + node = (EventListener *) event->list.head; + while (node->next) { + if (node->callback == callback && node->user_data == user_data) + return node; + node = node->next; + } + + return NULL; +} + + +/** + * g_mime_event_block: + * @event: a #GMimeEvent + * @callback: a #GMimeEventCallback + * @user_data: user context data + * + * Blocks the specified callback from being called when @event is emitted. + **/ +void +g_mime_event_block (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data) +{ + EventListener *listener; + + if ((listener = g_mime_event_find_listener (event, callback, user_data))) + listener->blocked++; +} + + +/** + * g_mime_event_unblock: + * @event: a #GMimeEvent + * @callback: a #GMimeEventCallback + * @user_data: user context data + * + * Unblocks the specified callback from being called when @event is + * emitted. + **/ +void +g_mime_event_unblock (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data) +{ + EventListener *listener; + + if ((listener = g_mime_event_find_listener (event, callback, user_data))) + listener->blocked--; +} + + +/** + * g_mime_event_add: + * @event: a #GMimeEvent + * @callback: a #GMimeEventCallback + * @user_data: user context data + * + * Adds a callback function that will get called with the specified + * @user_data whenever @event is emitted. + **/ +void +g_mime_event_add (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data) +{ + EventListener *listener; + + listener = event_listener_new (callback, user_data); + list_append (&event->list, (ListNode *) listener); +} + + +/** + * g_mime_event_remove: + * @event: a #GMimeEvent + * @callback: a #GMimeEventCallback + * @user_data: user context data + * + * Removes the specified callback function from the list of callbacks + * that will be called when the @event is emitted. + **/ +void +g_mime_event_remove (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data) +{ + EventListener *listener; + + if ((listener = g_mime_event_find_listener (event, callback, user_data))) { + list_unlink ((ListNode *) listener); + event_listener_free (listener); + } +} + + +/** + * g_mime_event_emit: + * @event: a #GMimeEvent + * @args: an argument pointer + * + * Calls each callback registered with this @event with the specified + * @args. + **/ +void +g_mime_event_emit (GMimeEvent *event, gpointer args) +{ + EventListener *node; + + node = (EventListener *) event->list.head; + while (node->next) { + if (node->blocked <= 0) + node->callback (event->owner, args, node->user_data); + node = node->next; + } +} diff --git a/gmime/gmime-events.h b/gmime/gmime-events.h new file mode 100644 index 0000000..f062e8d --- /dev/null +++ b/gmime/gmime-events.h @@ -0,0 +1,46 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_EVENTS_H__ +#define __GMIME_EVENTS_H__ + +#include + +G_BEGIN_DECLS + +typedef void (* GMimeEventCallback) (gpointer sender, gpointer args, gpointer user_data); + +typedef struct _GMimeEvent GMimeEvent; + +G_GNUC_INTERNAL GMimeEvent *g_mime_event_new (gpointer owner); +G_GNUC_INTERNAL void g_mime_event_destroy (GMimeEvent *event); + +G_GNUC_INTERNAL void g_mime_event_add (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data); +G_GNUC_INTERNAL void g_mime_event_remove (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data); + +G_GNUC_INTERNAL void g_mime_event_block (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data); +G_GNUC_INTERNAL void g_mime_event_unblock (GMimeEvent *event, GMimeEventCallback callback, gpointer user_data); + +G_GNUC_INTERNAL void g_mime_event_emit (GMimeEvent *event, gpointer args); + +G_END_DECLS + +#endif /* __GMIME_EVENTS_H__ */ diff --git a/gmime/gmime-filter-basic.c b/gmime/gmime-filter-basic.c new file mode 100644 index 0000000..6be76d4 --- /dev/null +++ b/gmime/gmime-filter-basic.c @@ -0,0 +1,256 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-filter-basic.h" +#include "gmime-utils.h" + + +/** + * SECTION: gmime-filter-basic + * @title: GMimeFilterBasic + * @short_description: Basic transfer encoding filter + * @see_also: #GMimeFilter + * + * A #GMimeFilter which can encode or decode basic MIME encodings such + * as Quoted-Printable, Base64 and UUEncode. + **/ + + +static void g_mime_filter_basic_class_init (GMimeFilterBasicClass *klass); +static void g_mime_filter_basic_init (GMimeFilterBasic *filter, GMimeFilterBasicClass *klass); +static void g_mime_filter_basic_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_basic_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterBasicClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_basic_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterBasic), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_basic_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterBasic", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_basic_class_init (GMimeFilterBasicClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_basic_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_basic_init (GMimeFilterBasic *filter, GMimeFilterBasicClass *klass) +{ + +} + +static void +g_mime_filter_basic_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterBasic *basic = (GMimeFilterBasic *) filter; + GMimeEncoding *encoder = &basic->encoder; + + return g_mime_filter_basic_new (encoder->encoding, encoder->encode); +} + +/* here we do all of the basic mime filtering */ +static void +filter_filter (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + GMimeFilterBasic *basic = (GMimeFilterBasic *) filter; + GMimeEncoding *encoder = &basic->encoder; + size_t nwritten = 0; + size_t len; + + if (!encoder->encode && encoder->encoding == GMIME_CONTENT_ENCODING_UUENCODE) { + if (!(encoder->state & GMIME_UUDECODE_STATE_BEGIN)) { + register char *inptr, *inend; + size_t left; + + inend = inbuf + inlen; + inptr = inbuf; + + while (inptr < inend) { + left = inend - inptr; + if (left < 6) { + if (!strncmp (inptr, "begin ", left)) + g_mime_filter_backup (filter, inptr, left); + break; + } else if (!strncmp (inptr, "begin ", 6)) { + inbuf = inptr; + while (inptr < inend && *inptr != '\n') + inptr++; + + if (inptr < inend) { + inptr++; + encoder->state |= GMIME_UUDECODE_STATE_BEGIN; + /* we can start uudecoding... */ + inlen = inend - inptr; + inbuf = inptr; + } else { + g_mime_filter_backup (filter, inbuf, left); + } + break; + } + + /* go to the next line */ + while (inptr < inend && *inptr != '\n') + inptr++; + + if (inptr < inend) + inptr++; + } + } + + switch (encoder->state & GMIME_UUDECODE_STATE_MASK) { + case GMIME_UUDECODE_STATE_BEGIN: + /* "begin \n" has been found and not yet seen the end */ + break; + default: + /* either we haven't seen the begin-line or we've finished decoding */ + goto done; + } + } + + len = g_mime_encoding_outlen (encoder, inlen); + g_mime_filter_set_size (filter, len, FALSE); + nwritten = g_mime_encoding_step (encoder, inbuf, inlen, filter->outbuf); + g_assert (nwritten <= len); + + done: + *outprespace = filter->outpre; + *outbuf = filter->outbuf; + *outlen = nwritten; +} + +static void +filter_complete (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + GMimeFilterBasic *basic = (GMimeFilterBasic *) filter; + GMimeEncoding *encoder = &basic->encoder; + size_t nwritten = 0; + size_t len; + + if (!encoder->encode && encoder->encoding == GMIME_CONTENT_ENCODING_UUENCODE) { + switch (encoder->state & GMIME_UUDECODE_STATE_MASK) { + case GMIME_UUDECODE_STATE_BEGIN: + /* "begin \n" has been found and not yet seen the end */ + break; + default: + /* either we haven't seen the begin-line or we've finished decoding */ + goto done; + } + } + + len = g_mime_encoding_outlen (encoder, inlen); + g_mime_filter_set_size (filter, len, FALSE); + nwritten = g_mime_encoding_flush (encoder, inbuf, inlen, filter->outbuf); + g_assert (nwritten <= len); + + done: + + *outprespace = filter->outpre; + *outbuf = filter->outbuf; + *outlen = nwritten; +} + +/* should this 'flush' outstanding state/data bytes? */ +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterBasic *basic = (GMimeFilterBasic *) filter; + + g_mime_encoding_reset (&basic->encoder); +} + + +/** + * g_mime_filter_basic_new: + * @encoding: a #GMimeContentEncoding + * @encode: %TRUE to encode or %FALSE to decode + * + * Creates a new basic filter for @encoding. + * + * Returns: a new basic encoder filter. + **/ +GMimeFilter * +g_mime_filter_basic_new (GMimeContentEncoding encoding, gboolean encode) +{ + GMimeFilterBasic *basic; + + basic = g_object_newv (GMIME_TYPE_FILTER_BASIC, 0, NULL); + + if (encode) + g_mime_encoding_init_encode (&basic->encoder, encoding); + else + g_mime_encoding_init_decode (&basic->encoder, encoding); + + return (GMimeFilter *) basic; +} diff --git a/gmime/gmime-filter-basic.h b/gmime/gmime-filter-basic.h new file mode 100644 index 0000000..2e0fd9c --- /dev/null +++ b/gmime/gmime-filter-basic.h @@ -0,0 +1,64 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_BASIC_H__ +#define __GMIME_FILTER_BASIC_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_BASIC (g_mime_filter_basic_get_type ()) +#define GMIME_FILTER_BASIC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_BASIC, GMimeFilterBasic)) +#define GMIME_FILTER_BASIC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_BASIC, GMimeFilterBasicClass)) +#define GMIME_IS_FILTER_BASIC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_BASIC)) +#define GMIME_IS_FILTER_BASIC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_BASIC)) +#define GMIME_FILTER_BASIC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_BASIC, GMimeFilterBasicClass)) + +typedef struct _GMimeFilterBasic GMimeFilterBasic; +typedef struct _GMimeFilterBasicClass GMimeFilterBasicClass; + +/** + * GMimeFilterBasic: + * @parent_object: parent #GMimeFilter + * @encoder: #GMimeEncoding state + * + * A basic encoder/decoder filter for the MIME encodings. + **/ +struct _GMimeFilterBasic { + GMimeFilter parent_object; + GMimeEncoding encoder; +}; + +struct _GMimeFilterBasicClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_basic_get_type (void); + +GMimeFilter *g_mime_filter_basic_new (GMimeContentEncoding encoding, gboolean encode); + +G_END_DECLS + +#endif /* __GMIME_FILTER_BASIC_H__ */ diff --git a/gmime/gmime-filter-best.c b/gmime/gmime-filter-best.c new file mode 100644 index 0000000..a81aa07 --- /dev/null +++ b/gmime/gmime-filter-best.c @@ -0,0 +1,332 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-filter-best.h" + + +/** + * SECTION: gmime-filter-best + * @title: GMimeFilterBest + * @short_description: Determine the best charset/encoding to use for a stream + * @see_also: #GMimeFilter + * + * A #GMimeFilter which is meant to determine the best charset and/or + * transfer encoding suitable for the stream which is filtered through + * it. + **/ + + +static void g_mime_filter_best_class_init (GMimeFilterBestClass *klass); +static void g_mime_filter_best_init (GMimeFilterBest *filter, GMimeFilterBestClass *klass); +static void g_mime_filter_best_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_best_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterBestClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_best_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterBest), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_best_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterBest", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_best_class_init (GMimeFilterBestClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_best_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_best_init (GMimeFilterBest *filter, GMimeFilterBestClass *klass) +{ + filter->frombuf[5] = '\0'; +} + +static void +g_mime_filter_best_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterBest *best = (GMimeFilterBest *) filter; + + return g_mime_filter_best_new (best->flags); +} + +static void +filter_filter (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + GMimeFilterBest *best = (GMimeFilterBest *) filter; + register unsigned char *inptr, *inend; + register unsigned char c; + size_t left; + + if (best->flags & GMIME_FILTER_BEST_CHARSET) + g_mime_charset_step (&best->charset, inbuf, inlen); + + if (best->flags & GMIME_FILTER_BEST_ENCODING) { + best->total += inlen; + + inptr = (unsigned char *) inbuf; + inend = inptr + inlen; + + while (inptr < inend) { + c = 0; + + if (best->midline) { + while (inptr < inend && (c = *inptr++) != '\n') { + if (c == 0) + best->count0++; + else if (c & 0x80) + best->count8++; + + if (best->fromlen > 0 && best->fromlen < 5) + best->frombuf[best->fromlen++] = c & 0xff; + + best->linelen++; + } + + if (c == '\n') { + best->maxline = MAX (best->maxline, best->linelen); + best->startline = TRUE; + best->midline = FALSE; + } + } + + /* check our from-save buffer for "From " */ + if (best->fromlen == 5 && !strcmp ((char *) best->frombuf, "From ")) + best->hadfrom = TRUE; + + best->fromlen = 0; + + left = inend - inptr; + + /* if we have not yet found a from-line, check for one */ + if (best->startline && !best->hadfrom && left > 0) { + if (left < 5) { + if (!strncmp ((char *) inptr, "From ", left)) { + memcpy (best->frombuf, inptr, left); + best->frombuf[left] = '\0'; + best->fromlen = left; + break; + } + } else { + if (!strncmp ((char *) inptr, "From ", 5)) { + best->hadfrom = TRUE; + inptr += 5; + } + } + } + + best->startline = FALSE; + best->midline = TRUE; + } + } + + *outprespace = prespace; + *outlen = inlen; + *outbuf = inbuf; +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GMimeFilterBest *best = (GMimeFilterBest *) filter; + + filter_filter (filter, in, len, prespace, out, outlen, outprespace); + + best->maxline = MAX (best->maxline, best->linelen); +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterBest *best = (GMimeFilterBest *) filter; + + g_mime_charset_init (&best->charset); + best->count0 = 0; + best->count8 = 0; + best->total = 0; + best->maxline = 0; + best->linelen = 0; + best->fromlen = 0; + best->hadfrom = FALSE; + best->startline = TRUE; + best->midline = FALSE; +} + + +/** + * g_mime_filter_best_new: + * @flags: filter flags + * + * Creates a new GMimeFilterBest filter. @flags are used to determine + * which information to keep statistics of. If the + * #GMIME_FILTER_BEST_CHARSET bit is set, the filter will be able to + * compute the best charset for encoding the stream of data + * filtered. If the #GMIME_FILTER_BEST_ENCODING bit is set, the filter + * will be able to compute the best Content-Transfer-Encoding for use + * with the stream being filtered. + * + * Note: In order for the g_mime_filter_best_charset() function to + * work, the stream being filtered MUST already be encoded in UTF-8. + * + * Returns: a new best filter with flags @flags. + **/ +GMimeFilter * +g_mime_filter_best_new (GMimeFilterBestFlags flags) +{ + GMimeFilterBest *new; + + new = g_object_newv (GMIME_TYPE_FILTER_BEST, 0, NULL); + new->flags = flags; + filter_reset ((GMimeFilter *) new); + + return (GMimeFilter *) new; +} + + +/** + * g_mime_filter_best_charset: + * @best: best filter + * + * Calculates the best charset for encoding the stream filtered + * through the @best filter. + * + * Returns: a pointer to a string containing the name of the charset + * best suited for the text filtered through @best. + **/ +const char * +g_mime_filter_best_charset (GMimeFilterBest *best) +{ + const char *charset; + + g_return_val_if_fail (GMIME_IS_FILTER_BEST (best), NULL); + + if (!(best->flags & GMIME_FILTER_BEST_CHARSET)) + return NULL; + + charset = g_mime_charset_best_name (&best->charset); + + return charset ? charset : "us-ascii"; +} + + +/** + * g_mime_filter_best_encoding: + * @best: a #GMimeFilterBest + * @constraint: a #GMimeEncodingConstraint + * + * Calculates the most efficient Content-Transfer-Encoding for the + * stream filtered through @best that fits within the encoding + * @constraint. + * + * Returns: the best encoding for the stream filtered by @best. + **/ +GMimeContentEncoding +g_mime_filter_best_encoding (GMimeFilterBest *best, GMimeEncodingConstraint constraint) +{ + GMimeContentEncoding encoding = GMIME_CONTENT_ENCODING_DEFAULT; + + g_return_val_if_fail (GMIME_IS_FILTER_BEST (best), GMIME_CONTENT_ENCODING_DEFAULT); + + if (!(best->flags & GMIME_FILTER_BEST_ENCODING)) + return GMIME_CONTENT_ENCODING_DEFAULT; + + switch (constraint) { + case GMIME_ENCODING_CONSTRAINT_7BIT: + if (best->count0 > 0) { + encoding = GMIME_CONTENT_ENCODING_BASE64; + } else if (best->count8 > 0) { + if (best->count8 >= (unsigned int) (best->total * (17.0 / 100.0))) + encoding = GMIME_CONTENT_ENCODING_BASE64; + else + encoding = GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE; + } else if (best->maxline > 998) { + encoding = GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE; + } + break; + case GMIME_ENCODING_CONSTRAINT_8BIT: + if (best->count0 > 0) { + encoding = GMIME_CONTENT_ENCODING_BASE64; + } else if (best->maxline > 998) { + encoding = GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE; + } + break; + case GMIME_ENCODING_CONSTRAINT_BINARY: + if (best->count0 + best->count8 > 0) + encoding = GMIME_CONTENT_ENCODING_BINARY; + break; + } + + if (encoding == GMIME_CONTENT_ENCODING_DEFAULT && best->hadfrom) + encoding = GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE; + + return encoding; +} diff --git a/gmime/gmime-filter-best.h b/gmime/gmime-filter-best.h new file mode 100644 index 0000000..c6caa6c --- /dev/null +++ b/gmime/gmime-filter-best.h @@ -0,0 +1,116 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_BEST_H__ +#define __GMIME_FILTER_BEST_H__ + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_BEST (g_mime_filter_best_get_type ()) +#define GMIME_FILTER_BEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_BEST, GMimeFilterBest)) +#define GMIME_FILTER_BEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_BEST, GMimeFilterBestClass)) +#define GMIME_IS_FILTER_BEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_BEST)) +#define GMIME_IS_FILTER_BEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_BEST)) +#define GMIME_FILTER_BEST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_BEST, GMimeFilterBestClass)) + +typedef struct _GMimeFilterBest GMimeFilterBest; +typedef struct _GMimeFilterBestClass GMimeFilterBestClass; + +/** + * GMimeFilterBestFlags: + * @GMIME_FILTER_BEST_CHARSET: Enable best-charset detection. + * @GMIME_FILTER_BEST_ENCODING: Enable best-encoding detection. + * + * Bit flags to enable charset and/or encoding scanning to make + * educated guesses as to what the best charset and/or encodings to + * use for the content passed through the filter. + **/ +typedef enum { + GMIME_FILTER_BEST_CHARSET = (1 << 0), + GMIME_FILTER_BEST_ENCODING = (1 << 1) +} GMimeFilterBestFlags; + + +/** + * GMimeFilterBest: + * @parent_object: parent #GMimeFilter + * @flags: #GMimeFilterBestFlags + * @charset: #GMimeCharset state + * @count0: count of nul-bytes passed through the filter + * @count8: count of 8bit bytes passed through the filter + * @total: total number of bytes passed through the filter + * @maxline: the length of the longest line passed through the filter + * @linelen: current line length + * @frombuf: buffer for checking From_ lines + * @fromlen: length of bytes in @frombuf + * @hadfrom: %TRUE if any line started with "From " + * @startline: start line state + * @midline: mid-line state + * + * A filter for calculating the best encoding and/or charset to encode + * the data passed through it. + **/ +struct _GMimeFilterBest { + GMimeFilter parent_object; + + GMimeFilterBestFlags flags; + + /* for best charset detection */ + GMimeCharset charset; + + /* for best encoding detection */ + unsigned int count0; /* count of null bytes */ + unsigned int count8; /* count of 8bit bytes */ + unsigned int total; /* total octets */ + + unsigned int maxline; /* longest line length */ + unsigned int linelen; /* current line length */ + + unsigned char frombuf[6]; + unsigned int fromlen : 4; + unsigned int hadfrom : 1; + + unsigned int startline : 1; + unsigned int midline : 1; +}; + +struct _GMimeFilterBestClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_best_get_type (void); + +GMimeFilter *g_mime_filter_best_new (GMimeFilterBestFlags flags); + +const char *g_mime_filter_best_charset (GMimeFilterBest *best); + +GMimeContentEncoding g_mime_filter_best_encoding (GMimeFilterBest *best, GMimeEncodingConstraint constraint); + +G_END_DECLS + +#endif /* __GMIME_FILTER_BEST_H__ */ diff --git a/gmime/gmime-filter-charset.c b/gmime/gmime-filter-charset.c new file mode 100644 index 0000000..e0de7f7 --- /dev/null +++ b/gmime/gmime-filter-charset.c @@ -0,0 +1,320 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-filter-charset.h" +#include "gmime-charset.h" +#include "gmime-iconv.h" + + +/** + * SECTION: gmime-filter-charset + * @title: GMimeFilterCharset + * @short_description: Charset-conversion filter + * @see_also: + * + * A #GMimeFilter which is used for converting text from one charset + * to another. + **/ + + +static void g_mime_filter_charset_class_init (GMimeFilterCharsetClass *klass); +static void g_mime_filter_charset_init (GMimeFilterCharset *filter, GMimeFilterCharsetClass *klass); +static void g_mime_filter_charset_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_charset_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterCharsetClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_charset_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterCharset), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_charset_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterCharset", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_charset_class_init (GMimeFilterCharsetClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_charset_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_charset_init (GMimeFilterCharset *filter, GMimeFilterCharsetClass *klass) +{ + filter->from_charset = NULL; + filter->to_charset = NULL; + filter->cd = (iconv_t) -1; +} + +static void +g_mime_filter_charset_finalize (GObject *object) +{ + GMimeFilterCharset *filter = (GMimeFilterCharset *) object; + + g_free (filter->from_charset); + g_free (filter->to_charset); + if (filter->cd != (iconv_t) -1) + g_mime_iconv_close (filter->cd); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterCharset *charset = (GMimeFilterCharset *) filter; + + return g_mime_filter_charset_new (charset->from_charset, charset->to_charset); +} + +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GMimeFilterCharset *charset = (GMimeFilterCharset *) filter; + size_t inleft, outleft, converted = 0; + char *inbuf; + char *outbuf; + + if (charset->cd == (iconv_t) -1) + goto noop; + + g_mime_filter_set_size (filter, len * 5 + 16, FALSE); + outbuf = filter->outbuf; + outleft = filter->outsize; + + inbuf = in; + inleft = len; + + do { + converted = iconv (charset->cd, (ICONV_CONST char **) &inbuf, &inleft, (ICONV_CONST char **) &outbuf, &outleft); + if (converted == (size_t) -1) { + if (errno == E2BIG || errno == EINVAL) + break; + + /* Note: GnuWin32's libiconv 1.9 can also set errno to ERANGE + * which seems to mean that it encountered a character that + * does not fit the specified 'from' charset. We'll handle + * that the same way we handle EILSEQ. */ + if (errno == EILSEQ || errno == ERANGE) { + /* + * EILSEQ An invalid multibyte sequence has been encountered + * in the input. + * + * What we do here is eat the invalid bytes in the sequence + * and continue. + */ + + inbuf++; + inleft--; + } else { + /* unknown error condition */ + goto noop; + } + } + } while (inleft > 0); + + if (inleft > 0) { + /* We've either got an E2BIG or EINVAL. Save the + remainder of the buffer as we'll process this next + time through */ + g_mime_filter_backup (filter, inbuf, inleft); + } + + *out = filter->outbuf; + *outlen = outbuf - filter->outbuf; + *outprespace = filter->outpre; + + return; + + noop: + + *out = in; + *outlen = len; + *outprespace = prespace; +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GMimeFilterCharset *charset = (GMimeFilterCharset *) filter; + size_t inleft, outleft, converted = 0; + char *inbuf; + char *outbuf; + + if (charset->cd == (iconv_t) -1) + goto noop; + + g_mime_filter_set_size (filter, len * 5 + 16, FALSE); + outbuf = filter->outbuf; + outleft = filter->outsize; + + inbuf = in; + inleft = len; + + if (inleft > 0) { + do { + converted = iconv (charset->cd, (ICONV_CONST char **) &inbuf, &inleft, (ICONV_CONST char **) &outbuf, &outleft); + if (converted != (size_t) -1) + continue; + + if (errno == E2BIG) { + /* + * E2BIG There is not sufficient room at *outbuf. + * + * We just need to grow our outbuffer and try again. + */ + + converted = outbuf - filter->outbuf; + g_mime_filter_set_size (filter, inleft * 5 + filter->outsize + 16, TRUE); + outbuf = filter->outbuf + converted; + outleft = filter->outsize - converted; + } else if (errno == EILSEQ) { + /* + * EILSEQ An invalid multibyte sequence has been encountered + * in the input. + * + * What we do here is eat the invalid bytes in the sequence + * and continue. + */ + + inbuf++; + inleft--; + } else if (errno == EINVAL) { + /* + * EINVAL An incomplete multibyte sequence has been encoun­ + * tered in the input. + * + * We assume that this can only happen if we've run out of + * bytes for a multibyte sequence, if not we're in trouble. + */ + + break; + } else { + goto noop; + } + } while (inleft > 0); + } + + /* flush the iconv conversion */ + while (iconv (charset->cd, NULL, NULL, &outbuf, &outleft) == (size_t) -1) { + if (errno != E2BIG) + break; + + converted = outbuf - filter->outbuf; + g_mime_filter_set_size (filter, filter->outsize + 16, TRUE); + outbuf = filter->outbuf + converted; + outleft = filter->outsize - converted; + } + + *out = filter->outbuf; + *outlen = outbuf - filter->outbuf; + *outprespace = filter->outpre; + + return; + + noop: + + *out = in; + *outlen = len; + *outprespace = prespace; +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterCharset *charset = (GMimeFilterCharset *) filter; + + if (charset->cd != (iconv_t) -1) + iconv (charset->cd, NULL, NULL, NULL, NULL); +} + + +/** + * g_mime_filter_charset_new: + * @from_charset: charset to convert from + * @to_charset: charset to convert to + * + * Creates a new #GMimeFilterCharset filter. + * + * Returns: a new charset filter or %NULL if the charset conversion is + * not possible. + **/ +GMimeFilter * +g_mime_filter_charset_new (const char *from_charset, const char *to_charset) +{ + GMimeFilterCharset *new; + iconv_t cd; + + cd = g_mime_iconv_open (to_charset, from_charset); + if (cd == (iconv_t) -1) + return NULL; + + new = g_object_newv (GMIME_TYPE_FILTER_CHARSET, 0, NULL); + new->from_charset = g_strdup (from_charset); + new->to_charset = g_strdup (to_charset); + new->cd = cd; + + return (GMimeFilter *) new; +} diff --git a/gmime/gmime-filter-charset.h b/gmime/gmime-filter-charset.h new file mode 100644 index 0000000..f687eef --- /dev/null +++ b/gmime/gmime-filter-charset.h @@ -0,0 +1,69 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_CHARSET_H__ +#define __GMIME_FILTER_CHARSET_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_CHARSET (g_mime_filter_charset_get_type ()) +#define GMIME_FILTER_CHARSET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_CHARSET, GMimeFilterCharset)) +#define GMIME_FILTER_CHARSET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_CHARSET, GMimeFilterCharsetClass)) +#define GMIME_IS_FILTER_CHARSET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_CHARSET)) +#define GMIME_IS_FILTER_CHARSET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_CHARSET)) +#define GMIME_FILTER_CHARSET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_CHARSET, GMimeFilterCharsetClass)) + +typedef struct _GMimeFilterCharset GMimeFilterCharset; +typedef struct _GMimeFilterCharsetClass GMimeFilterCharsetClass; + +/** + * GMimeFilterCharset: + * @parent_object: parent #GMimeFilter + * @from_charset: charset that the filter is converting from + * @to_charset: charset the filter is converting to + * @cd: charset conversion state + * + * A filter to convert between charsets. + **/ +struct _GMimeFilterCharset { + GMimeFilter parent_object; + + char *from_charset; + char *to_charset; + iconv_t cd; +}; + +struct _GMimeFilterCharsetClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_charset_get_type (void); + +GMimeFilter *g_mime_filter_charset_new (const char *from_charset, const char *to_charset); + +G_END_DECLS + +#endif /* __GMIME_FILTER_CHARSET_H__ */ diff --git a/gmime/gmime-filter-crlf.c b/gmime/gmime-filter-crlf.c new file mode 100644 index 0000000..de65802 --- /dev/null +++ b/gmime/gmime-filter-crlf.c @@ -0,0 +1,240 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gmime-filter-crlf.h" + + +/** + * SECTION: gmime-filter-crlf + * @title: GMimeFilterCRLF + * @short_description: Convert line-endings from LF to CRLF or vise versa + * + * A #GMimeFilter for converting between DOS and UNIX line-endings. + **/ + + +static void g_mime_filter_crlf_class_init (GMimeFilterCRLFClass *klass); +static void g_mime_filter_crlf_init (GMimeFilterCRLF *filter, GMimeFilterCRLFClass *klass); +static void g_mime_filter_crlf_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_crlf_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterCRLFClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_crlf_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterCRLF), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_crlf_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterCRLF", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_crlf_class_init (GMimeFilterCRLFClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_crlf_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_crlf_init (GMimeFilterCRLF *filter, GMimeFilterCRLFClass *klass) +{ + filter->saw_cr = FALSE; + filter->saw_lf = FALSE; + filter->saw_dot = FALSE; +} + +static void +g_mime_filter_crlf_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterCRLF *crlf = (GMimeFilterCRLF *) filter; + + return g_mime_filter_crlf_new (crlf->encode, crlf->dots); +} + +static void +filter_filter (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + GMimeFilterCRLF *crlf = (GMimeFilterCRLF *) filter; + register const char *inptr = inbuf; + const char *inend = inbuf + inlen; + char *outptr; + + if (crlf->encode) { + g_mime_filter_set_size (filter, 3 * inlen, FALSE); + + outptr = filter->outbuf; + while (inptr < inend) { + if (*inptr == '\r') { + crlf->saw_cr = TRUE; + } else if (*inptr == '\n') { + crlf->saw_lf = TRUE; + if (!crlf->saw_cr) + *outptr++ = '\r'; + crlf->saw_cr = FALSE; + } else { + if (crlf->dots && *inptr == '.' && crlf->saw_lf) + *outptr++ = '.'; + + crlf->saw_cr = FALSE; + crlf->saw_lf = FALSE; + } + + *outptr++ = *inptr++; + } + } else { + g_mime_filter_set_size (filter, inlen + 1, FALSE); + + outptr = filter->outbuf; + while (inptr < inend) { + if (*inptr == '\r') { + crlf->saw_dot = FALSE; + crlf->saw_cr = TRUE; + } else { + if (crlf->saw_cr) { + crlf->saw_cr = FALSE; + + if (*inptr == '\n') { + crlf->saw_lf = TRUE; + *outptr++ = *inptr++; + continue; + } else + *outptr++ = '\r'; + } + + if (!(crlf->dots && crlf->saw_dot && *inptr == '.')) + *outptr++ = *inptr; + } + + if (crlf->dots && *inptr == '.') { + if (crlf->saw_lf) { + crlf->saw_dot = TRUE; + } else if (crlf->saw_dot) { + crlf->saw_dot = FALSE; + } + } + + crlf->saw_lf = FALSE; + + inptr++; + } + } + + *outlen = outptr - filter->outbuf; + *outprespace = filter->outpre; + *outbuf = filter->outbuf; +} + +static void +filter_complete (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + if (inbuf && inlen) + filter_filter (filter, inbuf, inlen, prespace, outbuf, outlen, outprespace); +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterCRLF *crlf = (GMimeFilterCRLF *) filter; + + crlf->saw_cr = FALSE; + crlf->saw_lf = TRUE; + crlf->saw_dot = FALSE; +} + + +/** + * g_mime_filter_crlf_new: + * @encode: %TRUE if the filter should encode or %FALSE otherwise + * @dots: encode/decode dots (as for SMTP) + * + * Creates a new #GMimeFilterCRLF filter. + * + * If @encode is %TRUE, then lone line-feeds ('\n') will be 'encoded' + * into the canonical CRLF end-of-line sequence ("\r\n") otherwise + * CRLF sequences will be 'decoded' into the UNIX line-ending form + * ('\n'). + * + * The @dots parameter tells the filter whether or not it should + * encode or decode lines beginning with a dot ('.'). If both @encode + * and @dots are %TRUE, then a '.' at the beginning of a line will be + * 'encoded' into "..". If @encode is %FALSE, then ".." at the + * beginning of a line will be decoded into a single '.'. + * + * Returns: a new #GMimeFilterCRLF filter. + **/ +GMimeFilter * +g_mime_filter_crlf_new (gboolean encode, gboolean dots) +{ + GMimeFilterCRLF *new; + + new = g_object_newv (GMIME_TYPE_FILTER_CRLF, 0, NULL); + new->encode = encode; + new->dots = dots; + + return (GMimeFilter *) new; +} diff --git a/gmime/gmime-filter-crlf.h b/gmime/gmime-filter-crlf.h new file mode 100644 index 0000000..51eb089 --- /dev/null +++ b/gmime/gmime-filter-crlf.h @@ -0,0 +1,73 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_CRLF_H__ +#define __GMIME_FILTER_CRLF_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_CRLF (g_mime_filter_crlf_get_type ()) +#define GMIME_FILTER_CRLF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_CRLF, GMimeFilterCRLF)) +#define GMIME_FILTER_CRLF_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_CRLF, GMimeFilterCRLFClass)) +#define GMIME_IS_FILTER_CRLF(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_CRLF)) +#define GMIME_IS_FILTER_CRLF_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_CRLF)) +#define GMIME_FILTER_CRLF_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_CRLF, GMimeFilterCRLFClass)) + +typedef struct _GMimeFilterCRLF GMimeFilterCRLF; +typedef struct _GMimeFilterCRLFClass GMimeFilterCRLFClass; + +/** + * GMimeFilterCRLF: + * @parent_object: parent #GMimeFilter + * @encode: encoding vs decoding line endings/dots + * @saw_cr: previous char was a CR + * @saw_lf: previous char was a LF + * @saw_dot: previous char was a period + * + * A filter to convert between line-ending formats and encode/decode + * lines beginning with a '.'. + **/ +struct _GMimeFilterCRLF { + GMimeFilter parent_object; + + gboolean encode; + gboolean dots; + + gboolean saw_cr; + gboolean saw_lf; + gboolean saw_dot; +}; + +struct _GMimeFilterCRLFClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_crlf_get_type (void); + +GMimeFilter *g_mime_filter_crlf_new (gboolean encode, gboolean dots); + +G_END_DECLS + +#endif /* __GMIME_FILTER_CRLF_H__ */ diff --git a/gmime/gmime-filter-enriched.c b/gmime/gmime-filter-enriched.c new file mode 100644 index 0000000..3909a73 --- /dev/null +++ b/gmime/gmime-filter-enriched.c @@ -0,0 +1,611 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gmime-common.h" +#include "gmime-filter-enriched.h" + +/* text/enriched is rfc1896 */ + + +/** + * SECTION: gmime-filter-enriched + * @title: GMimeFilterEnriched + * @short_description: Convert text/enriched or text/rtf to HTML + * @see_also: #GMimeFilter + * + * A #GMimeFilter used for converting text/enriched or text/rtf to HTML. + **/ + + +typedef char * (*EnrichedParamParser) (const char *inptr, size_t inlen); + +static char *param_parse_colour (const char *inptr, size_t inlen); +static char *param_parse_font (const char *inptr, size_t inlen); +static char *param_parse_lang (const char *inptr, size_t inlen); + +static struct { + char *enriched; + char *html; + gboolean needs_param; + EnrichedParamParser parse_param; /* parses *and* validates the input */ +} enriched_tags[] = { + { "bold", "", FALSE, NULL }, + { "/bold", "", FALSE, NULL }, + { "italic", "", FALSE, NULL }, + { "/italic", "", FALSE, NULL }, + { "fixed", "", FALSE, NULL }, + { "/fixed", "", FALSE, NULL }, + { "smaller", "", FALSE, NULL }, + { "/smaller", "", FALSE, NULL }, + { "bigger", "", FALSE, NULL }, + { "/bigger", "", FALSE, NULL }, + { "underline", "", FALSE, NULL }, + { "/underline", "", FALSE, NULL }, + { "center", "

", FALSE, NULL }, + { "/center", "

", FALSE, NULL }, + { "flushleft", "

", FALSE, NULL }, + { "/flushleft", "

", FALSE, NULL }, + { "flushright", "

", FALSE, NULL }, + { "/flushright", "

", FALSE, NULL }, + { "excerpt", "
", FALSE, NULL }, + { "/excerpt", "
", FALSE, NULL }, + { "paragraph", "

", FALSE, NULL }, + { "signature", "

", FALSE, NULL }, + { "/signature", "
", FALSE, NULL }, + { "comment", "", FALSE, NULL }, + { "np", "
", FALSE, NULL }, + { "fontfamily", "", TRUE, param_parse_font }, + { "/fontfamily", "", FALSE, NULL }, + { "color", "", TRUE, param_parse_colour }, + { "/color", "", FALSE, NULL }, + { "lang", "", TRUE, param_parse_lang }, + { "/lang", "", FALSE, NULL }, + + /* don't handle this tag yet... */ + { "paraindent", "", FALSE, NULL }, + + /* as soon as we support all the tags that can have a param + * tag argument, these should be unnecessary, but we'll keep + * them anyway just in case? */ + { "param", "", FALSE, NULL }, +}; + +#define NUM_ENRICHED_TAGS (sizeof (enriched_tags) / sizeof (enriched_tags[0])) + +static GHashTable *enriched_hash = NULL; + + +static void g_mime_filter_enriched_class_init (GMimeFilterEnrichedClass *klass); +static void g_mime_filter_enriched_init (GMimeFilterEnriched *filter, GMimeFilterEnrichedClass *klass); +static void g_mime_filter_enriched_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_enriched_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterEnrichedClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_enriched_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterEnriched), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_enriched_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterEnriched", &info, 0); + } + + return type; +} + +static void +g_mime_filter_enriched_class_init (GMimeFilterEnrichedClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + guint i; + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_enriched_finalize; + + filter_class->copy = filter_copy; + filter_class->reset = filter_reset; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + + if (!enriched_hash) { + enriched_hash = g_hash_table_new (g_mime_strcase_hash, g_mime_strcase_equal); + for (i = 0; i < NUM_ENRICHED_TAGS; i++) + g_hash_table_insert (enriched_hash, enriched_tags[i].enriched, + enriched_tags[i].html); + } +} + +static void +g_mime_filter_enriched_init (GMimeFilterEnriched *filter, GMimeFilterEnrichedClass *klass) +{ + filter->flags = 0; + filter->nofill = 0; +} + +static void +g_mime_filter_enriched_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterEnriched *enriched = (GMimeFilterEnriched *) filter; + + return g_mime_filter_enriched_new (enriched->flags); +} + +#if 0 +static gboolean +enriched_tag_needs_param (const char *tag) +{ + int i; + + for (i = 0; i < NUM_ENRICHED_TAGS; i++) + if (!g_ascii_strcasecmp (tag, enriched_tags[i].enriched)) + return enriched_tags[i].needs_param; + + return FALSE; +} +#endif + +static gboolean +html_tag_needs_param (const char *tag) +{ + return strstr (tag, "%s") != NULL; +} + +static const char *valid_colours[] = { + "red", "green", "blue", "yellow", "cyan", "magenta", "black", "white" +}; + +#define NUM_VALID_COLOURS (sizeof (valid_colours) / sizeof (valid_colours[0])) + +static char * +param_parse_colour (const char *inptr, size_t inlen) +{ + const char *inend, *end; + guint32 rgb = 0; + guint v, i; + + for (i = 0; i < NUM_VALID_COLOURS; i++) { + if (!g_ascii_strncasecmp (inptr, valid_colours[i], inlen)) + return g_strdup (valid_colours[i]); + } + + /* check for numeric r/g/b in the format: ####,####,#### */ + if (inptr[4] != ',' || inptr[9] != ',') { + /* okay, mailer must have used a string name that + * rfc1896 did not specify? do some simple scanning + * action, a colour name MUST be [a-zA-Z] */ + end = inptr; + inend = inptr + inlen; + while (end < inend && ((*end >= 'a' && *end <= 'z') || (*end >= 'A' && *end <= 'Z'))) + end++; + + return g_strndup (inptr, (size_t) (end - inptr)); + } + + for (i = 0; i < 3; i++) { + v = strtoul (inptr, (char **) &end, 16); + if (end != inptr + 4) + goto invalid_format; + + v >>= 8; + rgb = (rgb << 8) | (v & 0xff); + + inptr += 5; + } + + return g_strdup_printf ("#%.6X", rgb); + + invalid_format: + + /* default colour? */ + return g_strdup ("black"); +} + +static char * +param_parse_font (const char *fontfamily, size_t inlen) +{ + register const char *inptr = fontfamily; + const char *inend = inptr + inlen; + + /* don't allow any of '"', '<', nor '>' */ + while (inptr < inend && *inptr != '"' && *inptr != '<' && *inptr != '>') + inptr++; + + return g_strndup (fontfamily, (size_t) (inptr - fontfamily)); +} + +static char * +param_parse_lang (const char *lang, size_t inlen) +{ + register const char *inptr = lang; + const char *inend = inptr + inlen; + + /* don't allow any of '"', '<', nor '>' */ + while (inptr < inend && *inptr != '"' && *inptr != '<' && *inptr != '>') + inptr++; + + return g_strndup (lang, (size_t) (inptr - lang)); +} + +static char * +param_parse (const char *enriched, const char *inptr, size_t inlen) +{ + guint i; + + for (i = 0; i < NUM_ENRICHED_TAGS; i++) { + if (!g_ascii_strcasecmp (enriched, enriched_tags[i].enriched)) + return enriched_tags[i].parse_param (inptr, inlen); + } + + g_assert_not_reached (); + + return NULL; +} + +#define IS_RICHTEXT GMIME_FILTER_ENRICHED_IS_RICHTEXT + +static void +enriched_to_html (GMimeFilter *filter, char *in, size_t inlen, size_t prespace, + char **out, size_t *outlen, size_t *outprespace, gboolean flush) +{ + GMimeFilterEnriched *enriched = (GMimeFilterEnriched *) filter; + const char *tag, *inend, *outend; + register const char *inptr; + register char *outptr; + + g_mime_filter_set_size (filter, inlen * 2 + 6, FALSE); + + inptr = in; + inend = in + inlen; + outptr = filter->outbuf; + outend = filter->outbuf + filter->outsize; + + retry: + do { + while (inptr < inend && outptr < outend && !strchr (" <>&\n", *inptr)) + *outptr++ = *inptr++; + + if (outptr == outend) + goto backup; + + if ((inptr + 1) >= inend) + break; + + switch (*inptr++) { + case ' ': + while (inptr < inend && (outptr + 7) < outend && *inptr == ' ') { + memcpy (outptr, " ", 6); + outptr += 6; + inptr++; + } + + if (outptr < outend) + *outptr++ = ' '; + + break; + case '\n': + if (!(enriched->flags & IS_RICHTEXT)) { + /* text/enriched */ + if (enriched->nofill > 0) { + if ((outptr + 4) < outend) { + memcpy (outptr, "
", 4); + outptr += 4; + } else { + inptr--; + goto backup; + } + } else if (*inptr == '\n') { + if ((outptr + 4) >= outend) { + inptr--; + goto backup; + } + + while (inptr < inend && (outptr + 4) < outend && *inptr == '\n') { + memcpy (outptr, "
", 4); + outptr += 4; + inptr++; + } + } else { + *outptr++ = ' '; + } + } else { + /* text/richtext */ + *outptr++ = ' '; + } + break; + case '>': + if ((outptr + 4) < outend) { + memcpy (outptr, ">", 4); + outptr += 4; + } else { + inptr--; + goto backup; + } + break; + case '&': + if ((outptr + 5) < outend) { + memcpy (outptr, "&", 5); + outptr += 5; + } else { + inptr--; + goto backup; + } + break; + case '<': + if (!(enriched->flags & IS_RICHTEXT)) { + /* text/enriched */ + if (*inptr == '<') { + if ((outptr + 4) < outend) { + memcpy (outptr, "<", 4); + outptr += 4; + inptr++; + break; + } else { + inptr--; + goto backup; + } + } + } else { + /* text/richtext */ + if ((inend - inptr) >= 3 && (outptr + 4) < outend) { + if (strncmp (inptr, "lt>", 3) == 0) { + memcpy (outptr, "<", 4); + outptr += 4; + inptr += 3; + break; + } else if (strncmp (inptr, "nl>", 3) == 0) { + memcpy (outptr, "
", 4); + outptr += 4; + inptr += 3; + break; + } + } else { + inptr--; + goto backup; + } + } + + tag = inptr; + while (inptr < inend && *inptr != '>') + inptr++; + + if (inptr == inend) { + inptr = tag - 1; + goto need_input; + } + + if (!g_ascii_strncasecmp (tag, "nofill>", 7)) { + if ((outptr + 5) < outend) { + enriched->nofill++; + } else { + inptr = tag - 1; + goto backup; + } + } else if (!g_ascii_strncasecmp (tag, "/nofill>", 8)) { + if ((outptr + 6) < outend) { + enriched->nofill--; + } else { + inptr = tag - 1; + goto backup; + } + } else { + const char *html_tag; + char *enriched_tag; + size_t len; + + len = inptr - tag; + enriched_tag = g_alloca (len + 1); + memcpy (enriched_tag, tag, len); + enriched_tag[len] = '\0'; + + html_tag = g_hash_table_lookup (enriched_hash, enriched_tag); + + if (html_tag) { + if (html_tag_needs_param (html_tag)) { + const char *start; + char *param; + + while (inptr < inend && *inptr != '<') + inptr++; + +#define PARAM_TAG_MIN_LEN (sizeof ("") + sizeof ("") - 1) + if (inptr == inend || (size_t) (inend - inptr) <= PARAM_TAG_MIN_LEN) { + inptr = tag - 1; + goto need_input; + } + + if (g_ascii_strncasecmp (inptr, "", 7) != 0) { + /* ignore the enriched command tag... */ + inptr -= 1; + goto loop; + } + + inptr += 7; + start = inptr; + + while (inptr < inend && *inptr != '<') + inptr++; + + if (inptr == inend || (inend - inptr) <= 8) { + inptr = tag - 1; + goto need_input; + } + + if (g_ascii_strncasecmp (inptr, "", 8) != 0) { + /* ignore the enriched command tag... */ + inptr += 7; + goto loop; + } + + len = inptr - start; + param = param_parse (enriched_tag, start, len); + len = strlen (param); + + inptr += 7; + + len += strlen (html_tag); + + if ((outptr + len) < outend) { + outptr += g_snprintf (outptr, len, html_tag, param); + g_free (param); + } else { + g_free (param); + inptr = tag - 1; + goto backup; + } + } else { + len = strlen (html_tag); + if ((outptr + len) < outend) { + memcpy (outptr, html_tag, len); + outptr += len; + } else { + inptr = tag - 1; + goto backup; + } + } + } + } + + loop: + inptr++; + break; + default: + break; + } + } while (inptr < inend); + + need_input: + + /* the reason we ignore @flush here is because if there isn't + enough input to parse a tag, then there's nothing we can + do. */ + + if (inptr < inend) + g_mime_filter_backup (filter, inptr, (unsigned) (inend - inptr)); + + *out = filter->outbuf; + *outlen = outptr - filter->outbuf; + *outprespace = filter->outpre; + + return; + + backup: + + if (flush) { + size_t offset, grow; + + grow = (inend - inptr) * 2 + 20; + offset = outptr - filter->outbuf; + g_mime_filter_set_size (filter, filter->outsize + grow, TRUE); + outend = filter->outbuf + filter->outsize; + outptr = filter->outbuf + offset; + + goto retry; + } else { + g_mime_filter_backup (filter, inptr, (unsigned) (inend - inptr)); + } + + *out = filter->outbuf; + *outlen = outptr - filter->outbuf; + *outprespace = filter->outpre; +} + +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + enriched_to_html (filter, in, len, prespace, out, outlen, outprespace, FALSE); +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + enriched_to_html (filter, in, len, prespace, out, outlen, outprespace, TRUE); +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterEnriched *enriched = (GMimeFilterEnriched *) filter; + + enriched->nofill = 0; +} + + +/** + * g_mime_filter_enriched_new: + * @flags: flags + * + * Creates a new GMimeFilterEnriched object. + * + * Returns: a new GMimeFilter object. + **/ +GMimeFilter * +g_mime_filter_enriched_new (guint32 flags) +{ + GMimeFilterEnriched *new; + + new = g_object_newv (GMIME_TYPE_FILTER_ENRICHED, 0, NULL); + new->flags = flags; + + return (GMimeFilter *) new; +} diff --git a/gmime/gmime-filter-enriched.h b/gmime/gmime-filter-enriched.h new file mode 100644 index 0000000..383c2be --- /dev/null +++ b/gmime/gmime-filter-enriched.h @@ -0,0 +1,76 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_ENRICHED_H__ +#define __GMIME_FILTER_ENRICHED_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_ENRICHED (g_mime_filter_enriched_get_type ()) +#define GMIME_FILTER_ENRICHED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_ENRICHED, GMimeFilterEnriched)) +#define GMIME_FILTER_ENRICHED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_ENRICHED, GMimeFilterEnrichedClass)) +#define GMIME_IS_FILTER_ENRICHED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_ENRICHED)) +#define GMIME_IS_FILTER_ENRICHED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_ENRICHED)) +#define GMIME_FILTER_ENRICHED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_ENRICHED, GMimeFilterEnrichedClass)) + +typedef struct _GMimeFilterEnriched GMimeFilterEnriched; +typedef struct _GMimeFilterEnrichedClass GMimeFilterEnrichedClass; + + +/** + * GMIME_FILTER_ENRICHED_IS_RICHTEXT: + * + * A bit flag for g_mime_filter_enriched_new() which signifies that + * the filter should expect Rich Text (aka RTF). + **/ +#define GMIME_FILTER_ENRICHED_IS_RICHTEXT (1 << 0) + +/** + * GMimeFilterEnriched: + * @parent_object: parent #GMimeFilter + * @flags: bit flags + * @nofill: nofill tag state + * + * A filter for converting text/enriched or text/richtext textual + * streams into text/html. + **/ +struct _GMimeFilterEnriched { + GMimeFilter parent_object; + + guint32 flags; + int nofill; +}; + +struct _GMimeFilterEnrichedClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_enriched_get_type (void); + +GMimeFilter *g_mime_filter_enriched_new (guint32 flags); + +G_END_DECLS + +#endif /* __GMIME_FILTER_ENRICHED_H__ */ diff --git a/gmime/gmime-filter-from.c b/gmime/gmime-filter-from.c new file mode 100644 index 0000000..0018771 --- /dev/null +++ b/gmime/gmime-filter-from.c @@ -0,0 +1,268 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-filter-from.h" + + +/** + * SECTION: gmime-filter-from + * @title: GMimeFilterFrom + * @short_description: Escape MBox From_ lines + * @see_also: #GMimeFilter + * + * A #GMimeFilter used for escaping MBox From_ lines using either the + * traditional ">From " or quoted-printable encoding. + **/ + + +static void g_mime_filter_from_class_init (GMimeFilterFromClass *klass); +static void g_mime_filter_from_init (GMimeFilterFrom *filter, GMimeFilterFromClass *klass); +static void g_mime_filter_from_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, + size_t prespace, char **out, + size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, + size_t prespace, char **out, + size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_from_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterFromClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_from_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterFrom), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_from_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterFrom", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_from_class_init (GMimeFilterFromClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_from_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_from_init (GMimeFilterFrom *filter, GMimeFilterFromClass *klass) +{ + filter->midline = FALSE; +} + +static void +g_mime_filter_from_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterFrom *from = (GMimeFilterFrom *) filter; + + return g_mime_filter_from_new (from->mode); +} + +struct fromnode { + struct fromnode *next; + char *pointer; +}; + +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GMimeFilterFrom *from = (GMimeFilterFrom *) filter; + struct fromnode *head = NULL, *tail = (struct fromnode *) &head, *node; + register char *inptr, *inend; + int fromcount = 0; + char *outptr; + size_t left; + + inptr = in; + inend = inptr + len; + + while (inptr < inend) { + register int c = -1; + + if (from->midline) { + while (inptr < inend && (c = *inptr++) != '\n') + ; + } + + if (c == '\n' || !from->midline) { + left = (size_t) (inend - inptr); + if (left > 0) { + from->midline = TRUE; + if (left < 5) { + if (*inptr == 'F') { + g_mime_filter_backup (filter, inptr, left); + from->midline = FALSE; + inend = inptr; + break; + } + } else { + if (!strncmp (inptr, "From ", 5)) { + fromcount++; + + node = g_alloca (sizeof (struct fromnode)); + node->pointer = inptr; + node->next = NULL; + tail->next = node; + tail = node; + + inptr += 5; + } + } + } else { + from->midline = FALSE; + } + } + } + + if (fromcount > 0) { + if (from->mode == GMIME_FILTER_FROM_MODE_ARMOR) + len += (fromcount * 2); + else + len += fromcount; + + g_mime_filter_set_size (filter, len, FALSE); + + node = head; + inptr = in; + outptr = filter->outbuf; + while (node) { + memcpy (outptr, inptr, (unsigned) (node->pointer - inptr)); + outptr += node->pointer - inptr; + if (from->mode == GMIME_FILTER_FROM_MODE_ARMOR) { + *outptr++ = '='; + *outptr++ = '4'; + *outptr++ = '6'; + inptr = node->pointer + 1; + } else { + *outptr++ = '>'; + inptr = node->pointer; + } + + node = node->next; + } + + memcpy (outptr, inptr, (size_t) (inend - inptr)); + outptr += inend - inptr; + *out = filter->outbuf; + *outlen = (size_t) (outptr - filter->outbuf); + *outprespace = filter->outbuf - filter->outreal; + } else { + *out = in; + *outlen = (size_t) (inend - in); + *outprespace = prespace; + } +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + filter_filter (filter, in, len, prespace, out, outlen, outprespace); +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterFrom *from = (GMimeFilterFrom *) filter; + + from->midline = FALSE; +} + + +/** + * g_mime_filter_from_new: + * @mode: filter mode + * + * Creates a new GMimeFilterFrom filter. If @mode is + * #GMIME_FILTER_FROM_MODE_ARMOR, the from-filter will encode from + * lines using the quoted-printable encoding resulting in "=46rom ". + * Using the #GMIME_FILTER_FROM_MODE_DEFAULT or + * #GMIME_FILTER_FROM_MODE_ESCAPE mode (they are the same), from lines + * will be escaped to ">From ". + * + * Note: If you plan on using a from-filter in mode ARMOR, you should + * remember to also use a #GMimeFilterBasic filter with an encoding of + * #GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE. + * + * Returns: a new from filter with mode @mode. + **/ +GMimeFilter * +g_mime_filter_from_new (GMimeFilterFromMode mode) +{ + GMimeFilterFrom *new; + + new = g_object_newv (GMIME_TYPE_FILTER_FROM, 0, NULL); + new->midline = FALSE; + switch (mode) { + case GMIME_FILTER_FROM_MODE_ARMOR: + new->mode = mode; + break; + case GMIME_FILTER_FROM_MODE_ESCAPE: + default: + new->mode = GMIME_FILTER_FROM_MODE_ESCAPE; + break; + } + + return (GMimeFilter *) new; +} diff --git a/gmime/gmime-filter-from.h b/gmime/gmime-filter-from.h new file mode 100644 index 0000000..b643bd4 --- /dev/null +++ b/gmime/gmime-filter-from.h @@ -0,0 +1,82 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_FROM_H__ +#define __GMIME_FILTER_FROM_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_FROM (g_mime_filter_from_get_type ()) +#define GMIME_FILTER_FROM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_FROM, GMimeFilterFrom)) +#define GMIME_FILTER_FROM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_FROM, GMimeFilterFromClass)) +#define GMIME_IS_FILTER_FROM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_FROM)) +#define GMIME_IS_FILTER_FROM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_FROM)) +#define GMIME_FILTER_FROM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_FROM, GMimeFilterFromClass)) + +typedef struct _GMimeFilterFrom GMimeFilterFrom; +typedef struct _GMimeFilterFromClass GMimeFilterFromClass; + + +/** + * GMimeFilterFromMode: + * @GMIME_FILTER_FROM_MODE_DEFAULT: Default mode. + * @GMIME_FILTER_FROM_MODE_ESCAPE: Escape 'From ' lines with a '>' + * @GMIME_FILTER_FROM_MODE_ARMOR: QP-Encode 'From ' lines + * + * The mode for a #GMimeFilterFrom filter. + **/ +typedef enum { + GMIME_FILTER_FROM_MODE_DEFAULT = 0, + GMIME_FILTER_FROM_MODE_ESCAPE = 0, + GMIME_FILTER_FROM_MODE_ARMOR = 1 +} GMimeFilterFromMode; + + +/** + * GMimeFilterFrom: + * @parent_object: parent #GMimeFilter + * @mode: #GMimeFilterFromMode + * @midline: %TRUE if in the middle of a line + * + * A filter for armoring or escaping lines beginning with "From ". + **/ +struct _GMimeFilterFrom { + GMimeFilter parent_object; + + GMimeFilterFromMode mode; + gboolean midline; +}; + +struct _GMimeFilterFromClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_from_get_type (void); + +GMimeFilter *g_mime_filter_from_new (GMimeFilterFromMode mode); + +G_END_DECLS + +#endif /* __GMIME_FILTER_FROM_H__ */ diff --git a/gmime/gmime-filter-gzip.c b/gmime/gmime-filter-gzip.c new file mode 100644 index 0000000..05c2277 --- /dev/null +++ b/gmime/gmime-filter-gzip.c @@ -0,0 +1,524 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include + +#include "gmime-filter-gzip.h" + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + + +/** + * SECTION: gmime-filter-gzip + * @title: GMimeFilterGZip + * @short_description: GNU Zip compression/decompression + * @see_also: #GMimeFilter + * + * A #GMimeFilter used for compressing or decompressing a stream using + * GNU Zip. + **/ + + +/* rfc1952 */ + +enum { + GZIP_FLAG_FTEXT = (1 << 0), + GZIP_FLAG_FHCRC = (1 << 1), + GZIP_FLAG_FEXTRA = (1 << 2), + GZIP_FLAG_FNAME = (1 << 3), + GZIP_FLAG_FCOMMENT = (1 << 4), + GZIP_FLAG_RESERVED0 = (1 << 5), + GZIP_FLAG_RESERVED1 = (1 << 6), + GZIP_FLAG_RESERVED2 = (1 << 7), +}; + +enum { + GZIP_OS_FAT, + GZIP_OS_AMIGA, + GZIP_OS_VMS, + GZIP_OS_UNIX, + GZIP_OS_VM_CMS, + GZIP_OS_ATARI_TOS, + GZIP_OS_HPFS, + GZIP_OS_MACINTOSH, + GZIP_OS_ZSYSTEM, + GZIP_OS_CPM, + GZIP_OS_TOPS20, + GZIP_OS_NTFS, + GZIP_OS_QDOS, + GZIP_OS_ACORN_RISCOS, + GZIP_OS_UNKNOWN = 255 +}; + +#define GZIP_FLAG_RESERVED (GZIP_FLAG_RESERVED0 | GZIP_FLAG_RESERVED1 | GZIP_FLAG_RESERVED2) + +/* http://www.gzip.org/zlib/rfc-gzip.html */ +typedef union { + unsigned char buf[10]; + struct { + guint8 id1; + guint8 id2; + guint8 cm; + guint8 flg; + guint32 mtime; + guint8 xfl; + guint8 os; + } v; +} gzip_hdr_t; + +typedef union { + struct { + guint16 xlen; + guint16 xlen_nread; + guint16 crc16; + + guint8 got_hdr:1; + guint8 is_valid:1; + guint8 got_xlen:1; + guint8 got_fname:1; + guint8 got_fcomment:1; + guint8 got_crc16:1; + } unzip; + struct { + guint32 wrote_hdr:1; + } zip; +} gzip_state_t; + +struct _GMimeFilterGZipPrivate { + z_stream *stream; + + gzip_state_t state; + gzip_hdr_t hdr; + + guint32 crc32; + guint32 isize; +}; + +static void g_mime_filter_gzip_class_init (GMimeFilterGZipClass *klass); +static void g_mime_filter_gzip_init (GMimeFilterGZip *filter, GMimeFilterGZipClass *klass); +static void g_mime_filter_gzip_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_gzip_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterGZipClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_gzip_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterGZip), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_gzip_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterGZip", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_gzip_class_init (GMimeFilterGZipClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_gzip_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_gzip_init (GMimeFilterGZip *filter, GMimeFilterGZipClass *klass) +{ + filter->priv = g_new0 (struct _GMimeFilterGZipPrivate, 1); + filter->priv->stream = g_new0 (z_stream, 1); + filter->priv->crc32 = crc32 (0, Z_NULL, 0); +} + +static void +g_mime_filter_gzip_finalize (GObject *object) +{ + GMimeFilterGZip *gzip = (GMimeFilterGZip *) object; + struct _GMimeFilterGZipPrivate *priv = gzip->priv; + + if (gzip->mode == GMIME_FILTER_GZIP_MODE_ZIP) + deflateEnd (priv->stream); + else + inflateEnd (priv->stream); + + g_free (priv->stream); + g_free (priv); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterGZip *gzip = (GMimeFilterGZip *) filter; + + return g_mime_filter_gzip_new (gzip->mode, gzip->level); +} + +static void +gzip_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace, int flush) +{ + GMimeFilterGZip *gzip = (GMimeFilterGZip *) filter; + struct _GMimeFilterGZipPrivate *priv = gzip->priv; + int retval; + + if (!priv->state.zip.wrote_hdr) { + priv->hdr.v.id1 = 31; + priv->hdr.v.id2 = 139; + priv->hdr.v.cm = Z_DEFLATED; + priv->hdr.v.mtime = 0; + priv->hdr.v.flg = 0; + if (gzip->level == Z_BEST_COMPRESSION) + priv->hdr.v.xfl = 2; + else if (gzip->level == Z_BEST_SPEED) + priv->hdr.v.xfl = 4; + else + priv->hdr.v.xfl = 0; + priv->hdr.v.os = GZIP_OS_UNKNOWN; + + g_mime_filter_set_size (filter, (len * 2) + 22, FALSE); + + memcpy (filter->outbuf, priv->hdr.buf, 10); + + priv->stream->next_out = (unsigned char *) filter->outbuf + 10; + priv->stream->avail_out = filter->outsize - 10; + + priv->state.zip.wrote_hdr = TRUE; + } else { + g_mime_filter_set_size (filter, (len * 2) + 12, FALSE); + + priv->stream->next_out = (unsigned char *) filter->outbuf; + priv->stream->avail_out = filter->outsize; + } + + priv->stream->next_in = (unsigned char *) in; + priv->stream->avail_in = len; + + do { + /* FIXME: handle error cases? */ + if ((retval = deflate (priv->stream, flush)) != Z_OK) + w(fprintf (stderr, "gzip: %d: %s\n", retval, priv->stream->msg)); + + if (flush == Z_FULL_FLUSH) { + size_t outlen; + + outlen = filter->outsize - priv->stream->avail_out; + g_mime_filter_set_size (filter, outlen + (priv->stream->avail_in * 2) + 12, TRUE); + priv->stream->next_out = (unsigned char *) filter->outbuf + outlen; + priv->stream->avail_out = filter->outsize - outlen; + + if (priv->stream->avail_in == 0) { + guint32 val; + + val = GUINT32_TO_LE (priv->crc32); + memcpy (priv->stream->next_out, &val, 4); + priv->stream->avail_out -= 4; + priv->stream->next_out += 4; + + val = GUINT32_TO_LE (priv->isize); + memcpy (priv->stream->next_out, &val, 4); + priv->stream->avail_out -= 4; + priv->stream->next_out += 4; + + break; + } + } else { + if (priv->stream->avail_in > 0) + g_mime_filter_backup (filter, (char *) priv->stream->next_in, + priv->stream->avail_in); + + break; + } + } while (1); + + priv->crc32 = crc32 (priv->crc32, (unsigned char *) in, len - priv->stream->avail_in); + priv->isize += len - priv->stream->avail_in; + + *out = filter->outbuf; + *outlen = filter->outsize - priv->stream->avail_out; + *outprespace = filter->outpre; +} + +static void +gunzip_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace, int flush) +{ + GMimeFilterGZip *gzip = (GMimeFilterGZip *) filter; + struct _GMimeFilterGZipPrivate *priv = gzip->priv; + guint16 need, val; + int retval; + + if (!priv->state.unzip.got_hdr) { + if (len < 10) { + g_mime_filter_backup (filter, in, len); + return; + } + + memcpy (priv->hdr.buf, in, 10); + priv->state.unzip.got_hdr = TRUE; + len -= 10; + in += 10; + + priv->state.unzip.is_valid = (priv->hdr.v.id1 == 31 && + priv->hdr.v.id2 == 139 && + priv->hdr.v.cm == Z_DEFLATED); + } + + if (!priv->state.unzip.is_valid) + return; + + if (priv->hdr.v.flg & GZIP_FLAG_FEXTRA) { + if (!priv->state.unzip.got_xlen) { + if (len < 2) { + g_mime_filter_backup (filter, in, len); + return; + } + + memcpy (&val, in, 2); + priv->state.unzip.xlen = GUINT16_FROM_LE (val); + priv->state.unzip.got_xlen = TRUE; + len -= 2; + in += 2; + } + + if (priv->state.unzip.xlen_nread < priv->state.unzip.xlen) { + need = priv->state.unzip.xlen - priv->state.unzip.xlen_nread; + + if (need < len) { + priv->state.unzip.xlen_nread += need; + len -= need; + in += need; + } else { + priv->state.unzip.xlen_nread += len; + return; + } + } + } + + if ((priv->hdr.v.flg & GZIP_FLAG_FNAME) && !priv->state.unzip.got_fname) { + while (*in && len > 0) { + len--; + in++; + } + + if (*in == '\0' && len > 0) { + priv->state.unzip.got_fname = TRUE; + len--; + in++; + } else { + return; + } + } + + if ((priv->hdr.v.flg & GZIP_FLAG_FCOMMENT) && !priv->state.unzip.got_fcomment) { + while (*in && len > 0) { + len--; + in++; + } + + if (*in == '\0' && len > 0) { + priv->state.unzip.got_fcomment = TRUE; + len--; + in++; + } else { + return; + } + } + + if ((priv->hdr.v.flg & GZIP_FLAG_FHCRC) && !priv->state.unzip.got_crc16) { + if (len < 2) { + g_mime_filter_backup (filter, in, len); + return; + } + + memcpy (&val, in, 2); + priv->state.unzip.crc16 = GUINT16_FROM_LE (val); + len -= 2; + in += 2; + } + + if (len == 0) + return; + + g_mime_filter_set_size (filter, (len * 2) + 12, FALSE); + + priv->stream->next_in = (unsigned char *) in; + priv->stream->avail_in = len - 8; + + priv->stream->next_out = (unsigned char *) filter->outbuf; + priv->stream->avail_out = filter->outsize; + + do { + /* FIXME: handle error cases? */ + /* Note: Z_BUF_ERROR is not really an error unless there is input available */ + if ((retval = inflate (priv->stream, flush)) != Z_OK && + !(retval == Z_BUF_ERROR && !priv->stream->avail_in)) + w(fprintf (stderr, "gunzip: %d: %s\n", retval, priv->stream->msg)); + + if (flush == Z_FULL_FLUSH) { + size_t outlen; + + if (priv->stream->avail_in == 0) { + /* FIXME: extract & compare calculated crc32 and isize values? */ + break; + } + + outlen = filter->outsize - priv->stream->avail_out; + g_mime_filter_set_size (filter, outlen + (priv->stream->avail_in * 2) + 12, TRUE); + priv->stream->next_out = (unsigned char *) filter->outbuf + outlen; + priv->stream->avail_out = filter->outsize - outlen; + } else { + priv->stream->avail_in += 8; + + if (priv->stream->avail_in > 0) + g_mime_filter_backup (filter, (char *) priv->stream->next_in, + priv->stream->avail_in); + + break; + } + } while (1); + + /* FIXME: if we keep this, we could check that the gzip'd + * stream is sane, but how would we tell our consumer if it + * was/wasn't? */ + /*priv->crc32 = crc32 (priv->crc32, in, len - priv->stream->avail_in - 8); + priv->isize += len - priv->stream->avail_in - 8;*/ + + *out = filter->outbuf; + *outlen = filter->outsize - priv->stream->avail_out; + *outprespace = filter->outpre; +} + +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GMimeFilterGZip *gzip = (GMimeFilterGZip *) filter; + + if (gzip->mode == GMIME_FILTER_GZIP_MODE_ZIP) + gzip_filter (filter, in, len, prespace, out, outlen, outprespace, Z_SYNC_FLUSH); + else + gunzip_filter (filter, in, len, prespace, out, outlen, outprespace, Z_SYNC_FLUSH); +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GMimeFilterGZip *gzip = (GMimeFilterGZip *) filter; + + if (gzip->mode == GMIME_FILTER_GZIP_MODE_ZIP) + gzip_filter (filter, in, len, prespace, out, outlen, outprespace, Z_FULL_FLUSH); + else + gunzip_filter (filter, in, len, prespace, out, outlen, outprespace, Z_FULL_FLUSH); +} + +/* should this 'flush' outstanding state/data bytes? */ +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterGZip *gzip = (GMimeFilterGZip *) filter; + struct _GMimeFilterGZipPrivate *priv = gzip->priv; + + memset (&priv->state, 0, sizeof (priv->state)); + + if (gzip->mode == GMIME_FILTER_GZIP_MODE_ZIP) + deflateReset (priv->stream); + else + inflateReset (priv->stream); + + priv->crc32 = crc32 (0, Z_NULL, 0); + priv->isize = 0; +} + + +/** + * g_mime_filter_gzip_new: + * @mode: zip or unzip + * @level: compression level + * + * Creates a new gzip (or gunzip) filter. + * + * Returns: a new gzip (or gunzip) filter. + **/ +GMimeFilter * +g_mime_filter_gzip_new (GMimeFilterGZipMode mode, int level) +{ + GMimeFilterGZip *new; + int retval; + + new = g_object_newv (GMIME_TYPE_FILTER_GZIP, 0, NULL); + new->mode = mode; + new->level = level; + + if (mode == GMIME_FILTER_GZIP_MODE_ZIP) + retval = deflateInit2 (new->priv->stream, level, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); + else + retval = inflateInit2 (new->priv->stream, -MAX_WBITS); + + if (retval != Z_OK) { + g_object_unref (new); + return NULL; + } + + return (GMimeFilter *) new; +} diff --git a/gmime/gmime-filter-gzip.h b/gmime/gmime-filter-gzip.h new file mode 100644 index 0000000..c73b37e --- /dev/null +++ b/gmime/gmime-filter-gzip.h @@ -0,0 +1,83 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_GZIP_H__ +#define __GMIME_FILTER_GZIP_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_GZIP (g_mime_filter_gzip_get_type ()) +#define GMIME_FILTER_GZIP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_GZIP, GMimeFilterGZip)) +#define GMIME_FILTER_GZIP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_GZIP, GMimeFilterGZipClass)) +#define GMIME_IS_FILTER_GZIP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_GZIP)) +#define GMIME_IS_FILTER_GZIP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_GZIP)) +#define GMIME_FILTER_GZIP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_GZIP, GMimeFilterGZipClass)) + +typedef struct _GMimeFilterGZip GMimeFilterGZip; +typedef struct _GMimeFilterGZipClass GMimeFilterGZipClass; + + +/** + * GMimeFilterGZipMode: + * @GMIME_FILTER_GZIP_MODE_ZIP: Compress (zip) mode. + * @GMIME_FILTER_GZIP_MODE_UNZIP: Uncompress (unzip) mode. + * + * The mode for the #GMimeFilterGZip filter. + **/ +typedef enum { + GMIME_FILTER_GZIP_MODE_ZIP, + GMIME_FILTER_GZIP_MODE_UNZIP +} GMimeFilterGZipMode; + + +/** + * GMimeFilterGZip: + * @parent_object: parent #GMimeFilter + * @priv: private state data + * @mode: #GMimeFilterGZipMode + * @level: compression level + * + * A filter for compresing or decompressing a gzip stream. + **/ +struct _GMimeFilterGZip { + GMimeFilter parent_object; + + struct _GMimeFilterGZipPrivate *priv; + + GMimeFilterGZipMode mode; + int level; +}; + +struct _GMimeFilterGZipClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_gzip_get_type (void); + +GMimeFilter *g_mime_filter_gzip_new (GMimeFilterGZipMode mode, int level); + +G_END_DECLS + +#endif /* __GMIME_FILTER_GZIP_H__ */ diff --git a/gmime/gmime-filter-html.c b/gmime/gmime-filter-html.c new file mode 100644 index 0000000..75c0fc1 --- /dev/null +++ b/gmime/gmime-filter-html.c @@ -0,0 +1,493 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "url-scanner.h" +#include "gmime-filter-html.h" + +#define d(x) + + +/** + * SECTION: gmime-filter-html + * @title: GMimeFilterHTML + * @short_description: Convert plain text into HTML + * @see_also: #GMimeFilter + * + * A #GMimeFilter used for converting plain text into HTML. + **/ + + +#define CONVERT_WEB_URLS GMIME_FILTER_HTML_CONVERT_URLS +#define CONVERT_ADDRSPEC GMIME_FILTER_HTML_CONVERT_ADDRESSES + +static struct { + unsigned int mask; + urlpattern_t pattern; +} patterns[] = { + { CONVERT_WEB_URLS, { "file://", "", url_file_start, url_file_end } }, + { CONVERT_WEB_URLS, { "ftp://", "", url_web_start, url_web_end } }, + { CONVERT_WEB_URLS, { "http://", "", url_web_start, url_web_end } }, + { CONVERT_WEB_URLS, { "https://", "", url_web_start, url_web_end } }, + { CONVERT_WEB_URLS, { "news://", "", url_web_start, url_web_end } }, + { CONVERT_WEB_URLS, { "nntp://", "", url_web_start, url_web_end } }, + { CONVERT_WEB_URLS, { "telnet://", "", url_web_start, url_web_end } }, + { CONVERT_WEB_URLS, { "www.", "http://", url_web_start, url_web_end } }, + { CONVERT_WEB_URLS, { "ftp.", "ftp://", url_web_start, url_web_end } }, + { CONVERT_ADDRSPEC, { "@", "mailto:", url_addrspec_start, url_addrspec_end } }, +}; + +#define NUM_URL_PATTERNS (sizeof (patterns) / sizeof (patterns[0])) + +static void g_mime_filter_html_class_init (GMimeFilterHTMLClass *klass); +static void g_mime_filter_html_init (GMimeFilterHTML *filter, GMimeFilterHTMLClass *klass); +static void g_mime_filter_html_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_html_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterHTMLClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_html_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterHTML), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_html_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterHTML", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_html_class_init (GMimeFilterHTMLClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_html_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_html_init (GMimeFilterHTML *filter, GMimeFilterHTMLClass *klass) +{ + filter->scanner = url_scanner_new (); + + filter->flags = 0; + filter->colour = 0; + filter->column = 0; + filter->pre_open = FALSE; +} + +static void +g_mime_filter_html_finalize (GObject *object) +{ + GMimeFilterHTML *html = (GMimeFilterHTML *) object; + + url_scanner_free (html->scanner); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterHTML *html = (GMimeFilterHTML *) filter; + + return g_mime_filter_html_new (html->flags, html->colour); +} + +static char * +check_size (GMimeFilter *filter, char *outptr, char **outend, size_t len) +{ + size_t outleft = (size_t) (*outend - outptr); + size_t offset; + + if (outleft >= len) + return outptr; + + offset = outptr - filter->outbuf; + + g_mime_filter_set_size (filter, filter->outsize + len, TRUE); + + *outend = filter->outbuf + filter->outsize; + + return filter->outbuf + offset; +} + +static int +citation_depth (const char *in) +{ + register const char *inptr = in; + int depth = 1; + + if (*inptr++ != '>') + return 0; + + /* check that it isn't an escaped From line */ + if (!strncmp (inptr, "From", 4)) + return 0; + + while (*inptr != '\n') { + if (*inptr == ' ') + inptr++; + + if (*inptr++ != '>') + break; + + depth++; + } + + return depth; +} + +static inline gunichar +html_utf8_getc (const unsigned char **in, const unsigned char *inend) +{ + register const unsigned char *inptr = *in; + register unsigned char c, r; + register gunichar u, m; + + if (inptr == inend) + return 0; + + while (inptr < inend) { + r = *inptr++; + loop: + if (r < 0x80) { + *in = inptr; + return r; + } else if (r < 0xf8) { /* valid start char? */ + u = r; + m = 0x7f80; /* used to mask out the length bits */ + do { + if (inptr >= inend) + return 0xffff; + + c = *inptr++; + if ((c & 0xc0) != 0x80) { + r = c; + goto loop; + } + + u = (u << 6) | (c & 0x3f); + r <<= 1; + m <<= 5; + } while (r & 0x40); + + *in = inptr; + + u &= ~m; + + return u; + } + } + + return 0xffff; +} + +static char * +writeln (GMimeFilter *filter, const char *in, const char *end, char *outptr, char **outend) +{ + GMimeFilterHTML *html = (GMimeFilterHTML *) filter; + const unsigned char *instart = (const unsigned char *) in; + const unsigned char *inend = (const unsigned char *) end; + const unsigned char *inptr = instart; + + while (inptr < inend) { + gunichar u; + + outptr = check_size (filter, outptr, outend, 16); + + u = html_utf8_getc (&inptr, inend); + switch (u) { + case 0xffff: + g_warning ("Invalid UTF-8 sequence encountered"); + return outptr; + break; + case '<': + outptr = g_stpcpy (outptr, "<"); + html->column++; + break; + case '>': + outptr = g_stpcpy (outptr, ">"); + html->column++; + break; + case '&': + outptr = g_stpcpy (outptr, "&"); + html->column++; + break; + case '"': + outptr = g_stpcpy (outptr, """); + html->column++; + break; + case '\t': + if (html->flags & (GMIME_FILTER_HTML_CONVERT_SPACES)) { + do { + outptr = check_size (filter, outptr, outend, 7); + outptr = g_stpcpy (outptr, " "); + html->column++; + } while (html->column % 8); + break; + } + /* otherwise, FALL THROUGH */ + case ' ': + if (html->flags & GMIME_FILTER_HTML_CONVERT_SPACES) { + if (inptr == (instart + 1) || (inptr < inend && (*inptr == ' ' || *inptr == '\t'))) { + outptr = g_stpcpy (outptr, " "); + html->column++; + break; + } + } + /* otherwise, FALL THROUGH */ + default: + if (u >= 0x20 && u < 0x80) { + *outptr++ = (char) (u & 0xff); + } else { + if (html->flags & GMIME_FILTER_HTML_ESCAPE_8BIT) + *outptr++ = '?'; + else + outptr += sprintf (outptr, "&#%u;", u); + } + html->column++; + break; + } + } + + return outptr; +} + +static void +html_convert (GMimeFilter *filter, char *in, size_t inlen, size_t prespace, + char **out, size_t *outlen, size_t *outprespace, gboolean flush) +{ + GMimeFilterHTML *html = (GMimeFilterHTML *) filter; + register char *inptr, *outptr; + char *start, *outend; + const char *inend; + int depth; + + g_mime_filter_set_size (filter, inlen * 2 + 6, FALSE); + + start = inptr = in; + inend = in + inlen; + outptr = filter->outbuf; + outend = filter->outbuf + filter->outsize; + + if (html->flags & GMIME_FILTER_HTML_PRE && !html->pre_open) { + outptr = g_stpcpy (outptr, "
");
+		html->pre_open = TRUE;
+	}
+	
+	do {
+		while (inptr < inend && *inptr != '\n')
+			inptr++;
+		
+		if (inptr == inend && !flush)
+			break;
+		
+		html->column = 0;
+		depth = 0;
+		
+		if (html->flags & GMIME_FILTER_HTML_MARK_CITATION) {
+			if ((depth = citation_depth (start)) > 0) {
+				char font[25];
+				
+				/* FIXME: we could easily support multiple colour depths here */
+				
+				g_snprintf (font, 25, "", html->colour);
+				
+				outptr = check_size (filter, outptr, &outend, 25);
+				outptr = g_stpcpy (outptr, font);
+			} else if (*start == '>') {
+				/* >From line */
+				start++;
+			}
+		} else if (html->flags & GMIME_FILTER_HTML_CITE) {
+			outptr = check_size (filter, outptr, &outend, 6);
+			outptr = g_stpcpy (outptr, "> ");
+			html->column += 2;
+		}
+		
+#define CONVERT_URLS_OR_ADDRESSES (GMIME_FILTER_HTML_CONVERT_URLS | GMIME_FILTER_HTML_CONVERT_ADDRESSES)
+		if (html->flags & CONVERT_URLS_OR_ADDRESSES) {
+			size_t matchlen, buflen, len;
+			urlmatch_t match;
+			
+			len = inptr - start;
+			
+			do {
+				if (url_scanner_scan (html->scanner, start, len, &match)) {
+					/* write out anything before the first regex match */
+					outptr = writeln (filter, start, start + match.um_so,
+							  outptr, &outend);
+					
+					start += match.um_so;
+					len -= match.um_so;
+					
+					matchlen = match.um_eo - match.um_so;
+					
+					buflen = 20 + strlen (match.prefix) + matchlen + matchlen;
+					outptr = check_size (filter, outptr, &outend, buflen);
+					
+					/* write out the href tag */
+					outptr = g_stpcpy (outptr, "");
+					
+					/* now write the matched string */
+					memcpy (outptr, start, matchlen);
+					html->column += matchlen;
+					outptr += matchlen;
+					start += matchlen;
+					len -= matchlen;
+					
+					/* close the href tag */
+					outptr = g_stpcpy (outptr, "");
+				} else {
+					/* nothing matched so write out the remainder of this line buffer */
+					outptr = writeln (filter, start, start + len, outptr, &outend);
+					break;
+				}
+			} while (len > 0);
+		} else {
+			outptr = writeln (filter, start, inptr, outptr, &outend);
+		}
+		
+		if ((html->flags & GMIME_FILTER_HTML_MARK_CITATION) && depth > 0) {
+			outptr = check_size (filter, outptr, &outend, 8);
+			outptr = g_stpcpy (outptr, "");
+		}
+		
+		if (html->flags & GMIME_FILTER_HTML_CONVERT_NL) {
+			outptr = check_size (filter, outptr, &outend, 5);
+			outptr = g_stpcpy (outptr, "
"); + } + + if (inptr < inend) + *outptr++ = '\n'; + + start = ++inptr; + } while (inptr < inend); + + if (flush) { + if (html->pre_open) { + /* close the pre-tag */ + outptr = check_size (filter, outptr, &outend, 10); + outptr = g_stpcpy (outptr, "
"); + } + } else if (start < inend) { + /* backup */ + g_mime_filter_backup (filter, start, (unsigned) (inend - start)); + } + + *out = filter->outbuf; + *outlen = outptr - filter->outbuf; + *outprespace = filter->outpre; +} + +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + html_convert (filter, in, len, prespace, out, outlen, outprespace, FALSE); +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + html_convert (filter, in, len, prespace, out, outlen, outprespace, TRUE); +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterHTML *html = (GMimeFilterHTML *) filter; + + html->column = 0; + html->pre_open = FALSE; +} + + +/** + * g_mime_filter_html_new: + * @flags: html flags + * @colour: citation colour + * + * Creates a new GMimeFilterHTML filter which can be used to convert a + * plain UTF-8 text stream into an html stream. + * + * Returns: a new html filter. + **/ +GMimeFilter * +g_mime_filter_html_new (guint32 flags, guint32 colour) +{ + GMimeFilterHTML *new; + guint i; + + new = g_object_newv (GMIME_TYPE_FILTER_HTML, 0, NULL); + new->flags = flags; + new->colour = colour; + + for (i = 0; i < NUM_URL_PATTERNS; i++) { + if (patterns[i].mask & flags) + url_scanner_add (new->scanner, &patterns[i].pattern); + } + + return (GMimeFilter *) new; +} diff --git a/gmime/gmime-filter-html.h b/gmime/gmime-filter-html.h new file mode 100644 index 0000000..530347c --- /dev/null +++ b/gmime/gmime-filter-html.h @@ -0,0 +1,140 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_HTML_H__ +#define __GMIME_FILTER_HTML_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_HTML (g_mime_filter_html_get_type ()) +#define GMIME_FILTER_HTML(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_HTML, GMimeFilterHTML)) +#define GMIME_FILTER_HTML_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_HTML, GMimeFilterHTMLClass)) +#define GMIME_IS_FILTER_HTML(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_HTML)) +#define GMIME_IS_FILTER_HTML_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_HTML)) +#define GMIME_FILTER_HTML_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_HTML, GMimeFilterHTMLClass)) + +typedef struct _GMimeFilterHTML GMimeFilterHTML; +typedef struct _GMimeFilterHTMLClass GMimeFilterHTMLClass; + + +/** + * GMIME_FILTER_HTML_PRE: + * + * Wrap stream in <pre> tags. + **/ +#define GMIME_FILTER_HTML_PRE (1 << 0) + + +/** + * GMIME_FILTER_HTML_CONVERT_NL: + * + * Convert new-lines ('\n') into <br> tags. + **/ +#define GMIME_FILTER_HTML_CONVERT_NL (1 << 1) + + +/** + * GMIME_FILTER_HTML_CONVERT_SPACES: + * + * Preserve whitespace by converting spaces into their appropriate + * html entities. + **/ +#define GMIME_FILTER_HTML_CONVERT_SPACES (1 << 2) + + +/** + * GMIME_FILTER_HTML_CONVERT_URLS: + * + * Wrap detected URLs in <a href=...> tags. + **/ +#define GMIME_FILTER_HTML_CONVERT_URLS (1 << 3) + + +/** + * GMIME_FILTER_HTML_MARK_CITATION: + * + * Change the colour of citation text. + **/ +#define GMIME_FILTER_HTML_MARK_CITATION (1 << 4) + + +/** + * GMIME_FILTER_HTML_CONVERT_ADDRESSES: + * + * Wrap email addresses in "mailto:" href tags. + **/ +#define GMIME_FILTER_HTML_CONVERT_ADDRESSES (1 << 5) + + +/** + * GMIME_FILTER_HTML_ESCAPE_8BIT: + * + * Converts 8bit characters to '?'. + **/ +#define GMIME_FILTER_HTML_ESCAPE_8BIT (1 << 6) + + +/** + * GMIME_FILTER_HTML_CITE: + * + * Cites text by prepending "> " to each cited line. + **/ +#define GMIME_FILTER_HTML_CITE (1 << 7) + + +/** + * GMimeFilterHTML: + * @parent_object: parent #GMimeFilter + * @scanner: URL scanner state + * @flags: flags specifying HTML conversion rules + * @colour: cite colour + * @column: current column + * @pre_open: currently inside of a 'pre' tag. + * + * A filter for converting text/plain into text/html. + **/ +struct _GMimeFilterHTML { + GMimeFilter parent_object; + + struct _UrlScanner *scanner; + + guint32 flags; + guint32 colour; + + guint32 column : 31; + guint32 pre_open : 1; +}; + +struct _GMimeFilterHTMLClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_html_get_type (void); + +GMimeFilter *g_mime_filter_html_new (guint32 flags, guint32 colour); + +G_END_DECLS + +#endif /* __GMIME_FILTER_HTML_H__ */ diff --git a/gmime/gmime-filter-md5.c b/gmime/gmime-filter-md5.c new file mode 100644 index 0000000..f27bf70 --- /dev/null +++ b/gmime/gmime-filter-md5.c @@ -0,0 +1,182 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "md5-utils.h" + +#include "gmime-filter-md5.h" + + +/** + * SECTION: gmime-filter-md5 + * @title: GMimeFilterMd5 + * @short_description: Calculate an md5sum + * @see_also: #GMimeFilter + * + * Calculate an md5sum for a stream. + **/ + + +struct _GMimeFilterMd5Private { + MD5Context md5; +}; + +static void g_mime_filter_md5_class_init (GMimeFilterMd5Class *klass); +static void g_mime_filter_md5_init (GMimeFilterMd5 *filter, GMimeFilterMd5Class *klass); +static void g_mime_filter_md5_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_md5_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterMd5Class), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_md5_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterMd5), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_md5_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterMd5", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_md5_class_init (GMimeFilterMd5Class *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_md5_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_md5_init (GMimeFilterMd5 *filter, GMimeFilterMd5Class *klass) +{ + filter->priv = g_new (struct _GMimeFilterMd5Private, 1); + md5_init (&filter->priv->md5); +} + +static void +g_mime_filter_md5_finalize (GObject *object) +{ + GMimeFilterMd5 *filter = (GMimeFilterMd5 *) object; + + g_free (filter->priv); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + return g_mime_filter_md5_new (); +} + + +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GMimeFilterMd5 *md5 = (GMimeFilterMd5 *) filter; + + md5_update (&md5->priv->md5, (unsigned char *) in, len); + + *out = in; + *outlen = len; + *outprespace = prespace; +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + filter_filter (filter, in, len, prespace, out, outlen, outprespace); +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterMd5 *md5 = (GMimeFilterMd5 *) filter; + + md5_init (&md5->priv->md5); +} + + +/** + * g_mime_filter_md5_new: + * + * Creates a new Md5 filter. + * + * Returns: a new Md5 filter. + **/ +GMimeFilter * +g_mime_filter_md5_new (void) +{ + return g_object_newv (GMIME_TYPE_FILTER_MD5, 0, NULL); +} + + +/** + * g_mime_filter_md5_get_digest: + * @md5: md5 filter object + * @digest: output buffer of at least 16 bytes + * + * Outputs the md5 digest into @digest. + **/ +void +g_mime_filter_md5_get_digest (GMimeFilterMd5 *md5, unsigned char digest[16]) +{ + g_return_if_fail (GMIME_IS_FILTER_MD5 (md5)); + + md5_final (&md5->priv->md5, digest); +} diff --git a/gmime/gmime-filter-md5.h b/gmime/gmime-filter-md5.h new file mode 100644 index 0000000..81bcb20 --- /dev/null +++ b/gmime/gmime-filter-md5.h @@ -0,0 +1,66 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_MD5_H__ +#define __GMIME_FILTER_MD5_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_MD5 (g_mime_filter_md5_get_type ()) +#define GMIME_FILTER_MD5(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_MD5, GMimeFilterMd5)) +#define GMIME_FILTER_MD5_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_MD5, GMimeFilterMd5Class)) +#define GMIME_IS_FILTER_MD5(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_MD5)) +#define GMIME_IS_FILTER_MD5_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_MD5)) +#define GMIME_FILTER_MD5_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_MD5, GMimeFilterMd5Class)) + +typedef struct _GMimeFilterMd5 GMimeFilterMd5; +typedef struct _GMimeFilterMd5Class GMimeFilterMd5Class; + +/** + * GMimeFilterMd5: + * @parent_object: parent #GMimeFilter + * @priv: private state data + * + * A filter for calculating the MD5 checksum of a stream. + **/ +struct _GMimeFilterMd5 { + GMimeFilter parent_object; + + struct _GMimeFilterMd5Private *priv; +}; + +struct _GMimeFilterMd5Class { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_md5_get_type (void); + +GMimeFilter *g_mime_filter_md5_new (void); + +void g_mime_filter_md5_get_digest (GMimeFilterMd5 *md5, unsigned char digest[16]); + +G_END_DECLS + +#endif /* __GMIME_FILTER_MD5_H__ */ diff --git a/gmime/gmime-filter-strip.c b/gmime/gmime-filter-strip.c new file mode 100644 index 0000000..0ef0259 --- /dev/null +++ b/gmime/gmime-filter-strip.c @@ -0,0 +1,184 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gmime-filter-strip.h" + + +/** + * SECTION: gmime-filter-strip + * @title: GMimeFilterStrip + * @short_description: Strip trailing whitespace from the end of lines + * @see_also: #GMimeFilter + * + * A #GMimeFilter used for stripping trailing whitespace from the end + * of lines. + **/ + + +static void g_mime_filter_strip_class_init (GMimeFilterStripClass *klass); +static void g_mime_filter_strip_init (GMimeFilterStrip *filter, GMimeFilterStripClass *klass); +static void g_mime_filter_strip_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_strip_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterStripClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_strip_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterStrip), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_strip_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterStrip", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_strip_class_init (GMimeFilterStripClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_strip_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_strip_init (GMimeFilterStrip *filter, GMimeFilterStripClass *klass) +{ + /* no-op */ +} + +static void +g_mime_filter_strip_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + return g_mime_filter_strip_new (); +} + +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + register unsigned char *inptr, *last; + unsigned char *inend, *start; + char *outptr; + + g_mime_filter_set_size (filter, len, FALSE); + + last = inptr = (unsigned char *) in; + inend = (unsigned char *) in + len; + + outptr = filter->outbuf; + + while (inptr < inend) { + start = inptr; + while (inptr < inend && *inptr != '\n') { + if (*inptr != ' ' && *inptr != '\t') + last = inptr + 1; + inptr++; + } + + memcpy (outptr, start, last - start); + outptr += (last - start); + if (inptr < inend) { + /* write the newline */ + *outptr++ = (char) *inptr++; + last = inptr; + } + } + + g_mime_filter_backup (filter, (char *) last, inptr - last); + + *out = filter->outbuf; + *outlen = outptr - filter->outbuf; + *outprespace = filter->outpre; +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + if (len) + filter_filter (filter, in, len, prespace, out, outlen, outprespace); +} + +static void +filter_reset (GMimeFilter *filter) +{ + /* no-op */ +} + + +/** + * g_mime_filter_strip_new: + * + * Creates a new #GMimeFilterStrip filter which will strip trailing + * whitespace from every line of input passed through the filter. + * + * Returns: a new strip filter. + **/ +GMimeFilter * +g_mime_filter_strip_new (void) +{ + return g_object_newv (GMIME_TYPE_FILTER_STRIP, 0, NULL); +} diff --git a/gmime/gmime-filter-strip.h b/gmime/gmime-filter-strip.h new file mode 100644 index 0000000..634195c --- /dev/null +++ b/gmime/gmime-filter-strip.h @@ -0,0 +1,62 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_STRIP_H__ +#define __GMIME_FILTER_STRIP_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_STRIP (g_mime_filter_strip_get_type ()) +#define GMIME_FILTER_STRIP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_STRIP, GMimeFilterStrip)) +#define GMIME_FILTER_STRIP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_STRIP, GMimeFilterStripClass)) +#define GMIME_IS_FILTER_STRIP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_STRIP)) +#define GMIME_IS_FILTER_STRIP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_STRIP)) +#define GMIME_FILTER_STRIP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_STRIP, GMimeFilterStripClass)) + +typedef struct _GMimeFilterStrip GMimeFilterStrip; +typedef struct _GMimeFilterStripClass GMimeFilterStripClass; + +/** + * GMimeFilterStrip: + * @parent_object: parent #GMimeFilter + * + * A filter for stripping whitespace from the end of lines. + **/ +struct _GMimeFilterStrip { + GMimeFilter parent_object; + +}; + +struct _GMimeFilterStripClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_strip_get_type (void); + +GMimeFilter *g_mime_filter_strip_new (void); + +G_END_DECLS + +#endif /* __GMIME_FILTER_STRIP_H__ */ diff --git a/gmime/gmime-filter-windows.c b/gmime/gmime-filter-windows.c new file mode 100644 index 0000000..336cb42 --- /dev/null +++ b/gmime/gmime-filter-windows.c @@ -0,0 +1,233 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gmime-filter-windows.h" +#include "gmime-charset.h" + +#define d(x) + + +/** + * SECTION: gmime-filter-windows + * @title: GMimeFilterWindows + * @short_description: Determine if text is in a Microsoft Windows codepage + * @see_also: #GMimeFilter + * + * A #GMimeFilter used for determining if text marked as iso-8859-## + * is actually encoded in one of the Windows-CP125# charsets. + **/ + + +static void g_mime_filter_windows_class_init (GMimeFilterWindowsClass *klass); +static void g_mime_filter_windows_init (GMimeFilterWindows *filter, GMimeFilterWindowsClass *klass); +static void g_mime_filter_windows_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_windows_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterWindowsClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_windows_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterWindows), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_windows_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterWindows", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_windows_class_init (GMimeFilterWindowsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_windows_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_windows_init (GMimeFilterWindows *filter, GMimeFilterWindowsClass *klass) +{ + filter->claimed_charset = NULL; + filter->is_windows = FALSE; +} + +static void +g_mime_filter_windows_finalize (GObject *object) +{ + GMimeFilterWindows *filter = (GMimeFilterWindows *) object; + + g_free (filter->claimed_charset); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterWindows *windows = (GMimeFilterWindows *) filter; + + return g_mime_filter_windows_new (windows->claimed_charset); +} + +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GMimeFilterWindows *windows = (GMimeFilterWindows *) filter; + register unsigned char *inptr; + unsigned char *inend; + + if (!windows->is_windows) { + inptr = (unsigned char *) in; + inend = inptr + len; + + while (inptr < inend) { + register unsigned char c = *inptr++; + + if (c >= 128 && c <= 159) { + d(g_warning ("Encountered text encoded in a Windows charset trying " + "to pass itself off as being encoded in %s", + windows->claimed_charset)); + windows->is_windows = TRUE; + break; + } + } + } + + *out = in; + *outlen = len; + *outprespace = prespace; +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + filter_filter (filter, in, len, prespace, out, outlen, outprespace); +} + +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterWindows *windows = (GMimeFilterWindows *) filter; + + windows->is_windows = FALSE; +} + + +/** + * g_mime_filter_windows_new: + * @claimed_charset: charset that a text stream claims to be + * + * Creates a new GMimeFilterWindows filter. When a stream of text has + * been filtered, it can be determined whether or not said text stream + * was in @claimed_charset or the equivalent Windows-CP125# charset. + * + * Returns: a new windows filter. + **/ +GMimeFilter * +g_mime_filter_windows_new (const char *claimed_charset) +{ + GMimeFilterWindows *new; + + g_return_val_if_fail (claimed_charset != NULL, NULL); + + new = g_object_newv (GMIME_TYPE_FILTER_WINDOWS, 0, NULL); + new->claimed_charset = g_strdup (claimed_charset); + + return (GMimeFilter *) new; +} + + +/** + * g_mime_filter_windows_is_windows_charset: + * @filter: windows filter object + * + * Determines whether or not a Windows-CP125# charset has been + * detected so far. + * + * Returns: %TRUE if the filtered stream has been detected to contain + * Windows-CP125# characters or %FALSE otherwise. + **/ +gboolean +g_mime_filter_windows_is_windows_charset (GMimeFilterWindows *filter) +{ + g_return_val_if_fail (GMIME_IS_FILTER_WINDOWS (filter), FALSE); + + return filter->is_windows; +} + + +/** + * g_mime_filter_windows_real_charset: + * @filter: windows filter object + * + * Figures out the real charset that the text is encoded in based on whether or not Windows-CP125# characters were found. + * + * Returns: a const string pointer to the claimed charset if filtered + * text stream was found not to contain any Windows-CP125# characters + * or the proper Windows-CP125# charset. + **/ +const char * +g_mime_filter_windows_real_charset (GMimeFilterWindows *filter) +{ + g_return_val_if_fail (GMIME_IS_FILTER_WINDOWS (filter), NULL); + + if (filter->is_windows) + return g_mime_charset_iso_to_windows (filter->claimed_charset); + else + return filter->claimed_charset; +} diff --git a/gmime/gmime-filter-windows.h b/gmime/gmime-filter-windows.h new file mode 100644 index 0000000..a65582f --- /dev/null +++ b/gmime/gmime-filter-windows.h @@ -0,0 +1,73 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_WINDOWS_H__ +#define __GMIME_FILTER_WINDOWS_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_WINDOWS (g_mime_filter_windows_get_type ()) +#define GMIME_FILTER_WINDOWS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_WINDOWS, GMimeFilterWindows)) +#define GMIME_FILTER_WINDOWS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_WINDOWS, GMimeFilterWindowsClass)) +#define GMIME_IS_FILTER_WINDOWS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_WINDOWS)) +#define GMIME_IS_FILTER_WINDOWS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_WINDOWS)) +#define GMIME_FILTER_WINDOWS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_WINDOWS, GMimeFilterWindowsClass)) + +typedef struct _GMimeFilterWindows GMimeFilterWindows; +typedef struct _GMimeFilterWindowsClass GMimeFilterWindowsClass; + +/** + * GMimeFilterWindows: + * @parent_object: parent #GMimeFilter + * @is_windows: %TRUE if the stream is detected to be a windows-cp125x charset + * @claimed_charset: charset the text stream is claimed to be + * + * A filter for detecting whether or not a text stream claimed to be + * iso-8859-X is really that charset or if it is really a + * Windows-CP125x charset. + **/ +struct _GMimeFilterWindows { + GMimeFilter parent_object; + + gboolean is_windows; + char *claimed_charset; +}; + +struct _GMimeFilterWindowsClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_windows_get_type (void); + +GMimeFilter *g_mime_filter_windows_new (const char *claimed_charset); + + +gboolean g_mime_filter_windows_is_windows_charset (GMimeFilterWindows *filter); + +const char *g_mime_filter_windows_real_charset (GMimeFilterWindows *filter); + +G_END_DECLS + +#endif /* __GMIME_FILTER_WINDOWS_H__ */ diff --git a/gmime/gmime-filter-yenc.c b/gmime/gmime-filter-yenc.c new file mode 100644 index 0000000..b042865 --- /dev/null +++ b/gmime/gmime-filter-yenc.c @@ -0,0 +1,607 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-filter-yenc.h" + + +/** + * SECTION: gmime-filter-yenc + * @title: GMimeFilterYenc + * @short_description: yEncode or yDecode + * @see_also: #GMimeFilter + * + * A #GMimeFilter used to encode or decode the Usenet yEncoding. + **/ + + +static void g_mime_filter_yenc_class_init (GMimeFilterYencClass *klass); +static void g_mime_filter_yenc_init (GMimeFilterYenc *filter, GMimeFilterYencClass *klass); +static void g_mime_filter_yenc_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GMimeFilterClass *parent_class = NULL; + + +GType +g_mime_filter_yenc_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterYencClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_yenc_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilterYenc), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_yenc_init, + }; + + type = g_type_register_static (GMIME_TYPE_FILTER, "GMimeFilterYenc", &info, 0); + } + + return type; +} + + +static void +g_mime_filter_yenc_class_init (GMimeFilterYencClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeFilterClass *filter_class = GMIME_FILTER_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_FILTER); + + object_class->finalize = g_mime_filter_yenc_finalize; + + filter_class->copy = filter_copy; + filter_class->filter = filter_filter; + filter_class->complete = filter_complete; + filter_class->reset = filter_reset; +} + +static void +g_mime_filter_yenc_init (GMimeFilterYenc *filter, GMimeFilterYencClass *klass) +{ + filter->part = 0; + filter->pcrc = GMIME_YENCODE_CRC_INIT; + filter->crc = GMIME_YENCODE_CRC_INIT; +} + +static void +g_mime_filter_yenc_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + GMimeFilterYenc *yenc = (GMimeFilterYenc *) filter; + + return g_mime_filter_yenc_new (yenc->encode); +} + +/* here we do all of the basic yEnc filtering */ +static void +filter_filter (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GMimeFilterYenc *yenc = (GMimeFilterYenc *) filter; + const unsigned char *inbuf; + unsigned char *outbuf; + size_t newlen = 0; + + if (yenc->encode) { + /* won't go to more than 2 * (x + 2) + 62 */ + g_mime_filter_set_size (filter, (len + 2) * 2 + 62, FALSE); + outbuf = (unsigned char *) filter->outbuf; + inbuf = (const unsigned char *) in; + newlen = g_mime_yencode_step (inbuf, len, outbuf, ¥c->state, + ¥c->pcrc, ¥c->crc); + g_assert (newlen <= (len + 2) * 2 + 62); + } else { + if (!(yenc->state & GMIME_YDECODE_STATE_DECODE)) { + register char *inptr, *inend; + size_t left; + + inptr = in; + inend = inptr + len; + + /* we cannot start decoding until we have found an =ybegin line */ + if (!(yenc->state & GMIME_YDECODE_STATE_BEGIN)) { + while (inptr < inend) { + left = inend - inptr; + if (left < 8) { + if (!strncmp (inptr, "=ybegin ", left)) + g_mime_filter_backup (filter, inptr, left); + break; + } else if (!strncmp (inptr, "=ybegin ", 8)) { + for (in = inptr; inptr < inend && *inptr != '\n'; inptr++); + if (inptr < inend) { + inptr++; + yenc->state |= GMIME_YDECODE_STATE_BEGIN; + /* we can start ydecoding if the next line isn't + a ypart... */ + in = inptr; + len = inend - in; + } else { + /* we don't have enough... */ + g_mime_filter_backup (filter, in, left); + } + break; + } + + /* go to the next line */ + while (inptr < inend && *inptr != '\n') + inptr++; + + if (inptr < inend) + inptr++; + } + } + + left = inend - inptr; + if ((yenc->state & GMIME_YDECODE_STATE_BEGIN) && left > 0) { + /* we have found an '=ybegin' line but we may yet have an "=ypart" line to + yield before decoding the content */ + if (left < 7 && !strncmp (inptr, "=ypart ", left)) { + g_mime_filter_backup (filter, inptr, left); + } else if (!strncmp (inptr, "=ypart ", 7)) { + for (in = inptr; inptr < inend && *inptr != '\n'; inptr++); + if (inptr < inend) { + inptr++; + yenc->state |= GMIME_YDECODE_STATE_PART | GMIME_YDECODE_STATE_DECODE; + in = inptr; + len = inend - in; + } else { + g_mime_filter_backup (filter, in, left); + } + } else { + /* guess it doesn't have a =ypart line */ + yenc->state |= GMIME_YDECODE_STATE_DECODE; + } + } + } + + if ((yenc->state & GMIME_YDECODE_STATE_DECODE) && !(yenc->state & GMIME_YDECODE_STATE_END)) { + /* all yEnc headers have been found so we can now start decoding */ + g_mime_filter_set_size (filter, len + 3, FALSE); + outbuf = (unsigned char *) filter->outbuf; + inbuf = (const unsigned char *) in; + newlen = g_mime_ydecode_step (inbuf, len, outbuf, ¥c->state, + ¥c->pcrc, ¥c->crc); + g_assert (newlen <= len + 3); + } else { + newlen = 0; + } + } + + *outprespace = filter->outpre; + *out = filter->outbuf; + *outlen = newlen; +} + +static void +filter_complete (GMimeFilter *filter, char *in, size_t len, size_t prespace, + char **out, size_t *outlen, size_t *outprespace) +{ + GMimeFilterYenc *yenc = (GMimeFilterYenc *) filter; + const unsigned char *inbuf; + unsigned char *outbuf; + size_t newlen = 0; + + if (yenc->encode) { + /* won't go to more than 2 * (x + 2) + 62 */ + g_mime_filter_set_size (filter, (len + 2) * 2 + 62, FALSE); + outbuf = (unsigned char *) filter->outbuf; + inbuf = (const unsigned char *) in; + newlen = g_mime_yencode_close (inbuf, len, outbuf, ¥c->state, + ¥c->pcrc, ¥c->crc); + g_assert (newlen <= (len + 2) * 2 + 62); + } else { + if ((yenc->state & GMIME_YDECODE_STATE_DECODE) && !(yenc->state & GMIME_YDECODE_STATE_END)) { + /* all yEnc headers have been found so we can now start decoding */ + g_mime_filter_set_size (filter, len + 3, FALSE); + outbuf = (unsigned char *) filter->outbuf; + inbuf = (const unsigned char *) in; + newlen = g_mime_ydecode_step (inbuf, len, outbuf, ¥c->state, + ¥c->pcrc, ¥c->crc); + g_assert (newlen <= len + 3); + } else { + newlen = 0; + } + } + + *outprespace = filter->outpre; + *out = filter->outbuf; + *outlen = newlen; +} + +/* should this 'flush' outstanding state/data bytes? */ +static void +filter_reset (GMimeFilter *filter) +{ + GMimeFilterYenc *yenc = (GMimeFilterYenc *) filter; + + if (yenc->encode) + yenc->state = GMIME_YENCODE_STATE_INIT; + else + yenc->state = GMIME_YDECODE_STATE_INIT; + + yenc->pcrc = GMIME_YENCODE_CRC_INIT; + yenc->crc = GMIME_YENCODE_CRC_INIT; +} + + +/** + * g_mime_filter_yenc_new: + * @encode: encode vs decode + * + * Creates a new yEnc filter. + * + * Returns: a new yEnc filter. + **/ +GMimeFilter * +g_mime_filter_yenc_new (gboolean encode) +{ + GMimeFilterYenc *new; + + new = g_object_newv (GMIME_TYPE_FILTER_YENC, 0, NULL); + new->encode = encode; + + if (encode) + new->state = GMIME_YENCODE_STATE_INIT; + else + new->state = GMIME_YDECODE_STATE_INIT; + + return (GMimeFilter *) new; +} + + +/** + * g_mime_filter_yenc_set_state: + * @yenc: yEnc filter + * @state: encode/decode state + * + * Sets the current state of the yencoder/ydecoder + **/ +void +g_mime_filter_yenc_set_state (GMimeFilterYenc *yenc, int state) +{ + g_return_if_fail (GMIME_IS_FILTER_YENC (yenc)); + + yenc->state = state; +} + + +/** + * g_mime_filter_yenc_set_crc: + * @yenc: yEnc filter + * @crc: crc32 + * + * Sets the current crc32 value on the yEnc filter @yenc to @crc. + **/ +void +g_mime_filter_yenc_set_crc (GMimeFilterYenc *yenc, guint32 crc) +{ + g_return_if_fail (GMIME_IS_FILTER_YENC (yenc)); + + yenc->crc = crc; +} + + +#if 0 +/* FIXME: once we parse out the yenc part id, we can re-enable this interface */ +/** + * g_mime_filter_yenc_get_part: + * @yenc: yEnc filter + * + * Gets the part id of the current decoded yEnc stream or %-1 on fail. + * + * Returns: the part id of the current decoded yEnc stream or %-1 on + * fail. + **/ +int +g_mime_filter_yenc_get_part (GMimeFilterYenc *yenc) +{ + g_return_val_if_fail (GMIME_IS_FILTER_YENC (yenc), -1); + + if (yenc->state & GMIME_YDECODE_STATE_PART) + return yenc->part; + + return -1; +} +#endif + +/** + * g_mime_filter_yenc_get_pcrc: + * @yenc: yEnc filter + * + * Get the computed part crc or (guint32) -1 on fail. + * + * Returns: the computed part crc or (guint32) -1 on fail. + **/ +guint32 +g_mime_filter_yenc_get_pcrc (GMimeFilterYenc *yenc) +{ + g_return_val_if_fail (GMIME_IS_FILTER_YENC (yenc), -1); + + return GMIME_YENCODE_CRC_FINAL (yenc->pcrc); +} + + +/** + * g_mime_filter_yenc_get_crc: + * @yenc: yEnc filter + * + * Get the computed crc or (guint32) -1 on fail. + * + * Returns: the computed crc or (guint32) -1 on fail. + **/ +guint32 +g_mime_filter_yenc_get_crc (GMimeFilterYenc *yenc) +{ + g_return_val_if_fail (GMIME_IS_FILTER_YENC (yenc), -1); + + return GMIME_YENCODE_CRC_FINAL (yenc->crc); +} + + +static const int yenc_crc_table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +#define yenc_crc_add(crc, c) (yenc_crc_table[(((int) (crc)) ^ ((unsigned char) (c))) & 0xff] ^ ((((int) (crc)) >> 8) & 0x00ffffff)) + +#define YENC_NEWLINE_ESCAPE (GMIME_YDECODE_STATE_EOLN | GMIME_YDECODE_STATE_ESCAPE) + + +/** + * g_mime_ydecode_step: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @state: ydecode state + * @pcrc: part crc state + * @crc: crc state + * + * Performs a 'decode step' on a chunk of yEncoded data of length + * @inlen pointed to by @inbuf and writes to @outbuf. Assumes the =ybegin + * and =ypart lines have already been stripped off. + * + * To get the crc32 value of the part, use #GMIME_YENCODE_CRC_FINAL + * (@pcrc). If there are more parts, you should reuse @crc without + * re-initializing. Once all parts have been decoded, you may get the + * combined crc32 value of all the parts using #GMIME_YENCODE_CRC_FINAL + * (@crc). + * + * Returns: the number of bytes decoded. + **/ +size_t +g_mime_ydecode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, + int *state, guint32 *pcrc, guint32 *crc) +{ + const register unsigned char *inptr; + register unsigned char *outptr; + const unsigned char *inend; + unsigned char c; + int ystate; + + if (*state & GMIME_YDECODE_STATE_END) + return 0; + + ystate = *state; + + inend = inbuf + inlen; + outptr = outbuf; + + inptr = inbuf; + while (inptr < inend) { + c = *inptr++; + + if ((ystate & YENC_NEWLINE_ESCAPE) == YENC_NEWLINE_ESCAPE) { + ystate &= ~GMIME_YDECODE_STATE_EOLN; + + if (c == 'y') { + /* we probably have a =yend here */ + ystate |= GMIME_YDECODE_STATE_END; + break; + } + } + + if (c == '\n') { + ystate |= GMIME_YDECODE_STATE_EOLN; + continue; + } + + if (ystate & GMIME_YDECODE_STATE_ESCAPE) { + ystate &= ~GMIME_YDECODE_STATE_ESCAPE; + c -= 64; + } else if (c == '=') { + ystate |= GMIME_YDECODE_STATE_ESCAPE; + continue; + } + + ystate &= ~GMIME_YDECODE_STATE_EOLN; + + *outptr++ = c -= 42; + + *pcrc = yenc_crc_add (*pcrc, c); + *crc = yenc_crc_add (*crc, c); + } + + *state = ystate; + + return outptr - outbuf; +} + + +/** + * g_mime_yencode_step: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @state: yencode state + * @pcrc: part crc state + * @crc: crc state + * + * Performs an yEncode 'encode step' on a chunk of raw data of length + * @inlen pointed to by @inbuf and writes to @outbuf. + * + * @state should be initialized to #GMIME_YENCODE_STATE_INIT before + * beginning making the first call to this function. Subsequent calls + * should reuse @state. + * + * Along the same lines, @pcrc and @crc should be initialized to + * #GMIME_YENCODE_CRC_INIT before using. + * + * Returns: the number of bytes encoded. + **/ +size_t +g_mime_yencode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, + int *state, guint32 *pcrc, guint32 *crc) +{ + const register unsigned char *inptr; + register unsigned char *outptr; + const unsigned char *inend; + register int already; + unsigned char c; + + inend = inbuf + inlen; + outptr = outbuf; + + already = *state; + + inptr = inbuf; + while (inptr < inend) { + c = *inptr++; + + *pcrc = yenc_crc_add (*pcrc, c); + *crc = yenc_crc_add (*crc, c); + + c += 42; + + if (c == '\0' || c == '\t' || c == '\r' || c == '\n' || c == '=') { + *outptr++ = '='; + *outptr++ = c + 64; + already += 2; + } else { + *outptr++ = c; + already++; + } + + if (already >= 128) { + *outptr++ = '\n'; + already = 0; + } + } + + *state = already; + + return outptr - outbuf; +} + + +/** + * g_mime_yencode_close: + * @inbuf: input buffer + * @inlen: input buffer length + * @outbuf: output buffer + * @state: yencode state + * @pcrc: part crc state + * @crc: crc state + * + * Call this function when finished encoding data with + * g_mime_yencode_step() to flush off the remaining state. + * + * #GMIME_YENCODE_CRC_FINAL (@pcrc) will give you the crc32 of the + * encoded "part". If there are more "parts" to encode, you should + * re-use @crc when encoding the next "parts" and then use + * #GMIME_YENCODE_CRC_FINAL (@crc) to get the combined crc32 value of + * all the parts. + * + * Returns: the number of bytes encoded. + **/ +size_t +g_mime_yencode_close (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, + int *state, guint32 *pcrc, guint32 *crc) +{ + register unsigned char *outptr = outbuf; + + if (inlen) + outptr += g_mime_yencode_step (inbuf, inlen, outbuf, state, pcrc, crc); + + if (*state) + *outptr++ = '\n'; + + *state = GMIME_YENCODE_STATE_INIT; + + return outptr - outbuf; +} diff --git a/gmime/gmime-filter-yenc.h b/gmime/gmime-filter-yenc.h new file mode 100644 index 0000000..4eb3237 --- /dev/null +++ b/gmime/gmime-filter-yenc.h @@ -0,0 +1,174 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_YENC_H__ +#define __GMIME_FILTER_YENC_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER_YENC (g_mime_filter_yenc_get_type ()) +#define GMIME_FILTER_YENC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER_YENC, GMimeFilterYenc)) +#define GMIME_FILTER_YENC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER_YENC, GMimeFilterYencClass)) +#define GMIME_IS_FILTER_YENC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER_YENC)) +#define GMIME_IS_FILTER_YENC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER_YENC)) +#define GMIME_FILTER_YENC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER_YENC, GMimeFilterYencClass)) + +typedef struct _GMimeFilterYenc GMimeFilterYenc; +typedef struct _GMimeFilterYencClass GMimeFilterYencClass; + + +/** + * GMIME_YDECODE_STATE_INIT: + * + * Initial state for the g_mime_ydecode_step() function. + **/ +#define GMIME_YDECODE_STATE_INIT (0) + +/** + * GMIME_YENCODE_STATE_INIT: + * + * Initial state for the g_mime_ydecode_step() function. + **/ +#define GMIME_YENCODE_STATE_INIT (0) + +/* first 8 bits are reserved for saving a byte */ + +/** + * GMIME_YDECODE_STATE_EOLN: + * + * State bit that denotes the yEnc filter has reached an end-of-line. + * + * This state is for internal use only. + **/ +#define GMIME_YDECODE_STATE_EOLN (1 << 8) + +/** + * GMIME_YDECODE_STATE_ESCAPE: + * + * State bit that denotes the yEnc filter has reached an escape + * sequence. + * + * This state is for internal use only. + **/ +#define GMIME_YDECODE_STATE_ESCAPE (1 << 9) + +/* bits 10 and 11 reserved for later uses? */ + +/** + * GMIME_YDECODE_STATE_BEGIN: + * + * State bit that denotes the yEnc filter has found the =ybegin line. + **/ +#define GMIME_YDECODE_STATE_BEGIN (1 << 12) + +/** + * GMIME_YDECODE_STATE_PART: + * + * State bit that denotes the yEnc filter has found the =ypart + * line. (Note: not all yencoded blocks have one) + **/ +#define GMIME_YDECODE_STATE_PART (1 << 13) + +/** + * GMIME_YDECODE_STATE_DECODE: + * + * State bit that denotes yEnc filter has begun decoding the actual + * yencoded content and will continue to do so until an =yend line is + * found (or until there is nothing left to decode). + **/ +#define GMIME_YDECODE_STATE_DECODE (1 << 14) + +/** + * GMIME_YDECODE_STATE_END: + * + * State bit that denoates that g_mime_ydecode_step() has finished + * decoding. + **/ +#define GMIME_YDECODE_STATE_END (1 << 15) + +/** + * GMIME_YENCODE_CRC_INIT: + * + * Initial state for the crc and pcrc state variables. + **/ +#define GMIME_YENCODE_CRC_INIT (~0) + +/** + * GMIME_YENCODE_CRC_FINAL: + * @crc: crc or pcrc state variable + * + * Gets the final crc value from @crc. + **/ +#define GMIME_YENCODE_CRC_FINAL(crc) (~crc) + +/** + * GMimeFilterYenc: + * @parent_object: parent #GMimeFilter + * @encode: encode vs decode + * @part: part id + * @state: encode/decode state + * @pcrc: part crc + * @crc: full crc + * + * A filter for yEncoding or yDecoding a stream. + **/ +struct _GMimeFilterYenc { + GMimeFilter parent_object; + + gboolean encode; + + int part; + + int state; + guint32 pcrc; + guint32 crc; +}; + +struct _GMimeFilterYencClass { + GMimeFilterClass parent_class; + +}; + + +GType g_mime_filter_yenc_get_type (void); + +GMimeFilter *g_mime_filter_yenc_new (gboolean encode); + +void g_mime_filter_yenc_set_state (GMimeFilterYenc *yenc, int state); +void g_mime_filter_yenc_set_crc (GMimeFilterYenc *yenc, guint32 crc); + +/*int g_mime_filter_yenc_get_part (GMimeFilterYenc *yenc);*/ +guint32 g_mime_filter_yenc_get_pcrc (GMimeFilterYenc *yenc); +guint32 g_mime_filter_yenc_get_crc (GMimeFilterYenc *yenc); + + +size_t g_mime_ydecode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, + int *state, guint32 *pcrc, guint32 *crc); +size_t g_mime_yencode_step (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, + int *state, guint32 *pcrc, guint32 *crc); +size_t g_mime_yencode_close (const unsigned char *inbuf, size_t inlen, unsigned char *outbuf, + int *state, guint32 *pcrc, guint32 *crc); + +G_END_DECLS + +#endif /* __GMIME_FILTER_YENC_H__ */ diff --git a/gmime/gmime-filter.c b/gmime/gmime-filter.c new file mode 100644 index 0000000..c8c5657 --- /dev/null +++ b/gmime/gmime-filter.c @@ -0,0 +1,344 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include /* for memcpy */ + +#include "gmime-filter.h" + + +/** + * SECTION: gmime-filter + * @title: GMimeFilter + * @short_description: Abstract filter class + * @see_also: #GMimeStreamFilter + * + * Stream filters are an efficient way of converting data from one + * format to another. + **/ + + +struct _GMimeFilterPrivate { + char *inbuf; + size_t inlen; +}; + +#define PRE_HEAD (64) +#define BACK_HEAD (64) +#define _PRIVATE(o) (((GMimeFilter *)(o))->priv) + +static void g_mime_filter_class_init (GMimeFilterClass *klass); +static void g_mime_filter_init (GMimeFilter *filter, GMimeFilterClass *klass); +static void g_mime_filter_finalize (GObject *object); + +static GMimeFilter *filter_copy (GMimeFilter *filter); +static void filter_filter (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace); +static void filter_complete (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace); +static void filter_reset (GMimeFilter *filter); + + +static GObjectClass *parent_class = NULL; + + +GType +g_mime_filter_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeFilterClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_filter_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeFilter), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_filter_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeFilter", + &info, G_TYPE_FLAG_ABSTRACT); + } + + return type; +} + + +static void +g_mime_filter_class_init (GMimeFilterClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_filter_finalize; + + klass->copy = filter_copy; + klass->filter = filter_filter; + klass->complete = filter_complete; + klass->reset = filter_reset; +} + +static void +g_mime_filter_init (GMimeFilter *filter, GMimeFilterClass *klass) +{ + filter->priv = g_new0 (struct _GMimeFilterPrivate, 1); + filter->outptr = NULL; + filter->outreal = NULL; + filter->outbuf = NULL; + filter->outsize = 0; + + filter->backbuf = NULL; + filter->backsize = 0; + filter->backlen = 0; +} + +static void +g_mime_filter_finalize (GObject *object) +{ + GMimeFilter *filter = (GMimeFilter *) object; + + g_free (filter->priv->inbuf); + g_free (filter->priv); + g_free (filter->outreal); + g_free (filter->backbuf); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GMimeFilter * +filter_copy (GMimeFilter *filter) +{ + return NULL; +} + + +/** + * g_mime_filter_copy: + * @filter: filter + * + * Copies @filter into a new GMimeFilter object. + * + * Returns: a duplicate of @filter. + **/ +GMimeFilter * +g_mime_filter_copy (GMimeFilter *filter) +{ + g_return_val_if_fail (GMIME_IS_FILTER (filter), NULL); + + return GMIME_FILTER_GET_CLASS (filter)->copy (filter); +} + + +static void +filter_run (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace, + void (*filterfunc) (GMimeFilter *filter, + char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace)) +{ + /* here we take a performance hit, if the input buffer doesn't + have the pre-space required. We make a buffer that does... */ + if (prespace < filter->backlen) { + struct _GMimeFilterPrivate *p = _PRIVATE (filter); + size_t newlen = inlen + prespace + filter->backlen; + + if (p->inlen < newlen) { + /* NOTE: g_realloc copies data, we dont need that (slower) */ + g_free (p->inbuf); + p->inbuf = g_malloc (newlen + PRE_HEAD); + p->inlen = newlen + PRE_HEAD; + } + + /* copy to end of structure */ + memcpy (p->inbuf + p->inlen - inlen, inbuf, inlen); + inbuf = p->inbuf + p->inlen - inlen; + prespace = p->inlen - inlen; + } + + /* preload any backed up data */ + if (filter->backlen > 0) { + memcpy (inbuf - filter->backlen, filter->backbuf, filter->backlen); + inbuf -= filter->backlen; + inlen += filter->backlen; + prespace -= filter->backlen; + filter->backlen = 0; + } + + filterfunc (filter, inbuf, inlen, prespace, outbuf, outlen, outprespace); +} + + +static void +filter_filter (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + /* no-op */ +} + + +/** + * g_mime_filter_filter: + * @filter: filter + * @inbuf: input buffer + * @inlen: input buffer length + * @prespace: prespace buffer length + * @outbuf: pointer to output buffer + * @outlen: pointer to output length + * @outprespace: pointer to output prespace buffer length + * + * Filters the input data and writes it to @out. + **/ +void +g_mime_filter_filter (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + g_return_if_fail (GMIME_IS_FILTER (filter)); + + filter_run (filter, inbuf, inlen, prespace, outbuf, outlen, outprespace, + GMIME_FILTER_GET_CLASS (filter)->filter); +} + + +static void +filter_complete (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + /* no-op */ +} + + +/** + * g_mime_filter_complete: + * @filter: filter + * @inbuf: input buffer + * @inlen: input buffer length + * @prespace: prespace buffer length + * @outbuf: pointer to output buffer + * @outlen: pointer to output length + * @outprespace: pointer to output prespace buffer length + * + * Completes the filtering. + **/ +void +g_mime_filter_complete (GMimeFilter *filter, + char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace) +{ + g_return_if_fail (GMIME_IS_FILTER (filter)); + + filter_run (filter, inbuf, inlen, prespace, outbuf, outlen, outprespace, + GMIME_FILTER_GET_CLASS (filter)->complete); +} + + +static void +filter_reset (GMimeFilter *filter) +{ + /* no-op */ +} + + +/** + * g_mime_filter_reset: + * @filter: a #GMimeFilter object + * + * Resets the filter. + **/ +void +g_mime_filter_reset (GMimeFilter *filter) +{ + g_return_if_fail (GMIME_IS_FILTER (filter)); + + GMIME_FILTER_GET_CLASS (filter)->reset (filter); + + /* could free some buffers, if they are really big? */ + filter->backlen = 0; +} + + +/** + * g_mime_filter_backup: + * @filter: filter + * @data: data to backup + * @length: length of @data + * + * Sets number of bytes backed up on the input, new calls replace + * previous ones + **/ +void +g_mime_filter_backup (GMimeFilter *filter, const char *data, size_t length) +{ + g_return_if_fail (GMIME_IS_FILTER (filter)); + + if (filter->backsize < length) { + /* g_realloc copies data, unnecessary overhead */ + g_free (filter->backbuf); + filter->backbuf = g_malloc (length + BACK_HEAD); + filter->backsize = length + BACK_HEAD; + } + + filter->backlen = length; + memcpy (filter->backbuf, data, length); +} + + +/** + * g_mime_filter_set_size: + * @filter: filter + * @size: requested size for the output buffer + * @keep: %TRUE if existing data in the output buffer should be kept + * + * Ensure this much size is available for filter output (if required) + **/ +void +g_mime_filter_set_size (GMimeFilter *filter, size_t size, gboolean keep) +{ + g_return_if_fail (GMIME_IS_FILTER (filter)); + + if (filter->outsize < size) { + size_t offset = filter->outptr - filter->outreal; + + if (keep) { + filter->outreal = g_realloc (filter->outreal, size + PRE_HEAD * 4); + } else { + g_free (filter->outreal); + filter->outreal = g_malloc (size + PRE_HEAD * 4); + } + + filter->outptr = filter->outreal + offset; + filter->outbuf = filter->outreal + PRE_HEAD * 4; + filter->outsize = size; + + /* this could be offset from the end of the structure, but + this should be good enough */ + + filter->outpre = PRE_HEAD * 4; + } +} diff --git a/gmime/gmime-filter.h b/gmime/gmime-filter.h new file mode 100644 index 0000000..a96949f --- /dev/null +++ b/gmime/gmime-filter.h @@ -0,0 +1,113 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_FILTER_H__ +#define __GMIME_FILTER_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_FILTER (g_mime_filter_get_type ()) +#define GMIME_FILTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_FILTER, GMimeFilter)) +#define GMIME_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_FILTER, GMimeFilterClass)) +#define GMIME_IS_FILTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_FILTER)) +#define GMIME_IS_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_FILTER)) +#define GMIME_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_FILTER, GMimeFilterClass)) + +typedef struct _GMimeFilter GMimeFilter; +typedef struct _GMimeFilterClass GMimeFilterClass; + +/** + * GMimeFilter: + * @parent_object: parent #GObject + * @priv: private state data + * @outreal: real malloc'd buffer + * @outbuf: first writable position allowed (outreal + outpre) + * @outptr: current writale position + * @outsize: current bytes in @outbuf + * @outpre: current prespace of @outbuf + * @backbuf: backup buffer + * @backsize: backup buffer size + * @backlen: number of bytes backed-up in @backbuf + * + * Base class for filters used by #GMimeStreamFilter. + **/ +struct _GMimeFilter { + GObject parent_object; + + struct _GMimeFilterPrivate *priv; + + /* */ + char *outreal; /* real malloc'd buffer */ + char *outbuf; /* first 'writable' position allowed (outreal + outpre) */ + char *outptr; + size_t outsize; + size_t outpre; /* prespace of this buffer */ + + char *backbuf; + size_t backsize; + size_t backlen; /* significant data there */ +}; + +struct _GMimeFilterClass { + GObjectClass parent_class; + + /* virtual functions */ + GMimeFilter * (* copy) (GMimeFilter *filter); + + void (* filter) (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace); + + void (* complete) (GMimeFilter *filter, char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace); + + void (* reset) (GMimeFilter *filter); +}; + + +GType g_mime_filter_get_type (void); + + +GMimeFilter *g_mime_filter_copy (GMimeFilter *filter); + +void g_mime_filter_filter (GMimeFilter *filter, + char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace); + +void g_mime_filter_complete (GMimeFilter *filter, + char *inbuf, size_t inlen, size_t prespace, + char **outbuf, size_t *outlen, size_t *outprespace); + +void g_mime_filter_reset (GMimeFilter *filter); + + +/* sets/returns number of bytes backed up on the input */ +void g_mime_filter_backup (GMimeFilter *filter, const char *data, size_t length); + +/* ensure this much size available for filter output */ +void g_mime_filter_set_size (GMimeFilter *filter, size_t size, gboolean keep); + +G_END_DECLS + +#endif /* __GMIME_FILTER_H__ */ diff --git a/gmime/gmime-gpg-context.c b/gmime/gmime-gpg-context.c new file mode 100644 index 0000000..33387ad --- /dev/null +++ b/gmime/gmime-gpg-context.c @@ -0,0 +1,2319 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef __APPLE__ +#undef HAVE_POLL_H +#undef HAVE_POLL +typedef unsigned int nfds_t; +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_POLL_H +#include +#endif + +#include "gmime-gpg-context.h" +#ifdef ENABLE_CRYPTOGRAPHY +#include "gmime-filter-charset.h" +#include "gmime-stream-filter.h" +#include "gmime-stream-pipe.h" +#include "gmime-stream-mem.h" +#include "gmime-stream-fs.h" +#include "gmime-charset.h" +#endif /* ENABLE_CRYPTOGRAPHY */ +#include "gmime-error.h" + +#ifdef ENABLE_DEBUG +#define d(x) x +#else +#define d(x) +#endif + +#define _(x) x + + +/** + * SECTION: gmime-gpg-context + * @title: GMimeGpgContext + * @short_description: GnuPG crypto contexts + * @see_also: #GMimeCryptoContext + * + * A #GMimeGpgContext is a #GMimeCryptoContext that uses GnuPG to do + * all of the encryption and digital signatures. + **/ + + +static void g_mime_gpg_context_class_init (GMimeGpgContextClass *klass); +static void g_mime_gpg_context_init (GMimeGpgContext *ctx, GMimeGpgContextClass *klass); +static void g_mime_gpg_context_finalize (GObject *object); + +static GMimeDigestAlgo gpg_digest_id (GMimeCryptoContext *ctx, const char *name); + +static const char *gpg_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest); + +static int gpg_sign (GMimeCryptoContext *ctx, const char *userid, + GMimeDigestAlgo digest, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +static const char *gpg_get_signature_protocol (GMimeCryptoContext *ctx); + +static const char *gpg_get_encryption_protocol (GMimeCryptoContext *ctx); + +static const char *gpg_get_key_exchange_protocol (GMimeCryptoContext *ctx); + +static GMimeSignatureList *gpg_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *sigstream, + GError **err); + +static int gpg_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, + GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +static GMimeDecryptResult *gpg_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +static int gpg_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, + GError **err); + +static int gpg_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, + GMimeStream *ostream, GError **err); + + +static GMimeCryptoContextClass *parent_class = NULL; + + +GType +g_mime_gpg_context_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeGpgContextClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_gpg_context_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeGpgContext), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_gpg_context_init, + }; + + type = g_type_register_static (GMIME_TYPE_CRYPTO_CONTEXT, "GMimeGpgContext", &info, 0); + } + + return type; +} + + +static void +g_mime_gpg_context_class_init (GMimeGpgContextClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeCryptoContextClass *crypto_class = GMIME_CRYPTO_CONTEXT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_gpg_context_finalize; + + crypto_class->digest_id = gpg_digest_id; + crypto_class->digest_name = gpg_digest_name; + crypto_class->sign = gpg_sign; + crypto_class->verify = gpg_verify; + crypto_class->encrypt = gpg_encrypt; + crypto_class->decrypt = gpg_decrypt; + crypto_class->import_keys = gpg_import_keys; + crypto_class->export_keys = gpg_export_keys; + crypto_class->get_signature_protocol = gpg_get_signature_protocol; + crypto_class->get_encryption_protocol = gpg_get_encryption_protocol; + crypto_class->get_key_exchange_protocol = gpg_get_key_exchange_protocol; +} + +static void +g_mime_gpg_context_init (GMimeGpgContext *ctx, GMimeGpgContextClass *klass) +{ + ctx->auto_key_retrieve = FALSE; + ctx->always_trust = FALSE; + ctx->use_agent = FALSE; + ctx->path = NULL; +} + +static void +g_mime_gpg_context_finalize (GObject *object) +{ + GMimeGpgContext *ctx = (GMimeGpgContext *) object; + + g_free (ctx->path); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GMimeDigestAlgo +gpg_digest_id (GMimeCryptoContext *ctx, const char *name) +{ + if (name == NULL) + return GMIME_DIGEST_ALGO_DEFAULT; + + if (!g_ascii_strcasecmp (name, "pgp-")) + name += 4; + + if (!g_ascii_strcasecmp (name, "md2")) + return GMIME_DIGEST_ALGO_MD2; + else if (!g_ascii_strcasecmp (name, "md4")) + return GMIME_DIGEST_ALGO_MD4; + else if (!g_ascii_strcasecmp (name, "md5")) + return GMIME_DIGEST_ALGO_MD5; + else if (!g_ascii_strcasecmp (name, "sha1")) + return GMIME_DIGEST_ALGO_SHA1; + else if (!g_ascii_strcasecmp (name, "sha224")) + return GMIME_DIGEST_ALGO_SHA224; + else if (!g_ascii_strcasecmp (name, "sha256")) + return GMIME_DIGEST_ALGO_SHA256; + else if (!g_ascii_strcasecmp (name, "sha384")) + return GMIME_DIGEST_ALGO_SHA384; + else if (!g_ascii_strcasecmp (name, "sha512")) + return GMIME_DIGEST_ALGO_SHA512; + else if (!g_ascii_strcasecmp (name, "ripemd160")) + return GMIME_DIGEST_ALGO_RIPEMD160; + else if (!g_ascii_strcasecmp (name, "tiger192")) + return GMIME_DIGEST_ALGO_TIGER192; + else if (!g_ascii_strcasecmp (name, "haval-5-160")) + return GMIME_DIGEST_ALGO_HAVAL5160; + + return GMIME_DIGEST_ALGO_DEFAULT; +} + +static const char * +gpg_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest) +{ + switch (digest) { + case GMIME_DIGEST_ALGO_MD2: + return "pgp-md2"; + case GMIME_DIGEST_ALGO_MD4: + return "pgp-md4"; + case GMIME_DIGEST_ALGO_MD5: + return "pgp-md5"; + case GMIME_DIGEST_ALGO_SHA1: + return "pgp-sha1"; + case GMIME_DIGEST_ALGO_SHA224: + return "pgp-sha224"; + case GMIME_DIGEST_ALGO_SHA256: + return "pgp-sha256"; + case GMIME_DIGEST_ALGO_SHA384: + return "pgp-sha384"; + case GMIME_DIGEST_ALGO_SHA512: + return "pgp-sha512"; + case GMIME_DIGEST_ALGO_RIPEMD160: + return "pgp-ripemd160"; + case GMIME_DIGEST_ALGO_TIGER192: + return "pgp-tiger192"; + case GMIME_DIGEST_ALGO_HAVAL5160: + return "pgp-haval-5-160"; + default: + return "pgp-sha1"; + } +} + +static const char * +gpg_get_signature_protocol (GMimeCryptoContext *ctx) +{ + return "application/pgp-signature"; +} + +static const char * +gpg_get_encryption_protocol (GMimeCryptoContext *ctx) +{ + return "application/pgp-encrypted"; +} + +static const char * +gpg_get_key_exchange_protocol (GMimeCryptoContext *ctx) +{ + return "application/pgp-keys"; +} + +#ifdef ENABLE_CRYPTOGRAPHY +enum _GpgCtxMode { + GPG_CTX_MODE_SIGN, + GPG_CTX_MODE_VERIFY, + GPG_CTX_MODE_ENCRYPT, + GPG_CTX_MODE_SIGN_ENCRYPT, + GPG_CTX_MODE_DECRYPT, + GPG_CTX_MODE_IMPORT, + GPG_CTX_MODE_EXPORT, +}; + +struct _GpgCtx { + enum _GpgCtxMode mode; + GHashTable *userid_hint; + GMimeGpgContext *ctx; + pid_t pid; + + char *userid; + GPtrArray *recipients; + GMimeCipherAlgo cipher; + GMimeDigestAlgo digest; + + int stdin_fd; + int stdout_fd; + int stderr_fd; + int status_fd; + int secret_fd; /* used for sign/decrypt/verify */ + + /* status-fd buffer */ + char *statusbuf; + char *statusptr; + guint statusleft; + + char *need_id; + + GMimeStream *sigstream; + GMimeStream *istream; + GMimeStream *ostream; + + GByteArray *diag; + GMimeStream *diagnostics; + + GMimeCertificateList *encrypted_to; /* full list of encrypted-to recipients */ + GMimeSignatureList *signatures; + GMimeSignature *signature; + + int exit_status; + + unsigned int utf8:1; + unsigned int exited:1; + unsigned int complete:1; + unsigned int seen_eof1:1; + unsigned int seen_eof2:1; + unsigned int flushed:1; /* flushed the diagnostics stream (aka stderr) */ + unsigned int always_trust:1; + unsigned int use_agent:1; + unsigned int armor:1; + unsigned int need_passwd:1; + unsigned int bad_passwds:2; + unsigned int decrypt_okay:1; + + unsigned int padding:19; +}; + +static struct _GpgCtx * +gpg_ctx_new (GMimeGpgContext *ctx) +{ + struct _GpgCtx *gpg; + const char *charset; + GMimeStream *stream; + + gpg = g_slice_new (struct _GpgCtx); + gpg->mode = GPG_CTX_MODE_SIGN; + gpg->ctx = ctx; + gpg->userid_hint = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + gpg->decrypt_okay = FALSE; + gpg->complete = FALSE; + gpg->seen_eof1 = TRUE; + gpg->seen_eof2 = FALSE; + gpg->pid = (pid_t) -1; + gpg->exit_status = 0; + gpg->flushed = FALSE; + gpg->exited = FALSE; + + gpg->userid = NULL; + gpg->recipients = NULL; + gpg->cipher = GMIME_CIPHER_ALGO_DEFAULT; + gpg->digest = GMIME_DIGEST_ALGO_DEFAULT; + gpg->always_trust = FALSE; + gpg->use_agent = FALSE; + gpg->armor = FALSE; + + gpg->stdin_fd = -1; + gpg->stdout_fd = -1; + gpg->stderr_fd = -1; + gpg->status_fd = -1; + gpg->secret_fd = -1; + + gpg->statusbuf = g_malloc (128); + gpg->statusptr = gpg->statusbuf; + gpg->statusleft = 128; + + gpg->bad_passwds = 0; + gpg->need_passwd = FALSE; + gpg->need_id = NULL; + + gpg->encrypted_to = NULL; + gpg->signatures = NULL; + gpg->signature = NULL; + + gpg->sigstream = NULL; + gpg->istream = NULL; + gpg->ostream = NULL; + + stream = g_mime_stream_mem_new (); + gpg->diag = GMIME_STREAM_MEM (stream)->buffer; + charset = g_mime_charset_iconv_name (g_mime_locale_charset ()); + if (g_ascii_strcasecmp (charset, "UTF-8") != 0) { + GMimeStream *fstream; + GMimeFilter *filter; + + fstream = g_mime_stream_filter_new (stream); + filter = g_mime_filter_charset_new (charset, "UTF-8"); + g_mime_stream_filter_add ((GMimeStreamFilter *) fstream, filter); + g_object_unref (stream); + g_object_unref (filter); + + gpg->diagnostics = fstream; + + gpg->utf8 = FALSE; + } else { + /* system charset is UTF-8, shouldn't need any conversion */ + gpg->diagnostics = stream; + + gpg->utf8 = TRUE; + } + + return gpg; +} + +static void +gpg_ctx_set_mode (struct _GpgCtx *gpg, enum _GpgCtxMode mode) +{ + gpg->mode = mode; + gpg->need_passwd = ((gpg->mode == GPG_CTX_MODE_SIGN) || (gpg->mode == GPG_CTX_MODE_DECRYPT) || (gpg->mode == GPG_CTX_MODE_SIGN_ENCRYPT)); +} + +static void +gpg_ctx_set_digest (struct _GpgCtx *gpg, GMimeDigestAlgo digest) +{ + gpg->digest = digest; +} + +static void +gpg_ctx_set_always_trust (struct _GpgCtx *gpg, gboolean trust) +{ + gpg->always_trust = trust; +} + +static void +gpg_ctx_set_use_agent (struct _GpgCtx *gpg, gboolean use_agent) +{ + gpg->use_agent = use_agent; +} + +static void +gpg_ctx_set_userid (struct _GpgCtx *gpg, const char *userid) +{ + g_free (gpg->userid); + gpg->userid = g_strdup (userid); +} + +static void +gpg_ctx_add_recipient (struct _GpgCtx *gpg, const char *keyid) +{ + if (gpg->mode != GPG_CTX_MODE_ENCRYPT && + gpg->mode != GPG_CTX_MODE_SIGN_ENCRYPT && + gpg->mode != GPG_CTX_MODE_EXPORT) + return; + + if (!gpg->recipients) + gpg->recipients = g_ptr_array_new (); + + g_ptr_array_add (gpg->recipients, g_strdup (keyid)); +} + +static void +gpg_ctx_set_armor (struct _GpgCtx *gpg, gboolean armor) +{ + gpg->armor = armor; +} + +static void +gpg_ctx_set_istream (struct _GpgCtx *gpg, GMimeStream *istream) +{ + g_object_ref (istream); + if (gpg->istream) + g_object_unref (gpg->istream); + gpg->istream = istream; +} + +static void +gpg_ctx_set_ostream (struct _GpgCtx *gpg, GMimeStream *ostream) +{ + g_object_ref (ostream); + if (gpg->ostream) + g_object_unref (gpg->ostream); + gpg->ostream = ostream; + gpg->seen_eof1 = FALSE; +} + +static void +gpg_ctx_set_sigstream (struct _GpgCtx *gpg, GMimeStream *sigstream) +{ + g_object_ref (sigstream); + if (gpg->sigstream) + g_object_unref (gpg->sigstream); + gpg->sigstream = sigstream; +} + +static const char * +gpg_ctx_get_diagnostics (struct _GpgCtx *gpg) +{ + if (!gpg->flushed) { + g_mime_stream_flush (gpg->diagnostics); + g_byte_array_append (gpg->diag, (unsigned char *) "", 1); + gpg->flushed = TRUE; + } + + return (const char *) gpg->diag->data; +} + +static void +gpg_ctx_free (struct _GpgCtx *gpg) +{ + guint i; + + g_hash_table_destroy (gpg->userid_hint); + + g_free (gpg->userid); + + if (gpg->recipients) { + for (i = 0; i < gpg->recipients->len; i++) + g_free (gpg->recipients->pdata[i]); + + g_ptr_array_free (gpg->recipients, TRUE); + } + + if (gpg->stdin_fd != -1) + close (gpg->stdin_fd); + if (gpg->stdout_fd != -1) + close (gpg->stdout_fd); + if (gpg->stderr_fd != -1) + close (gpg->stderr_fd); + if (gpg->status_fd != -1) + close (gpg->status_fd); + if (gpg->secret_fd != -1) + close (gpg->secret_fd); + + g_free (gpg->statusbuf); + + g_free (gpg->need_id); + + if (gpg->sigstream) + g_object_unref (gpg->sigstream); + + if (gpg->istream) + g_object_unref (gpg->istream); + + if (gpg->ostream) + g_object_unref (gpg->ostream); + + g_object_unref (gpg->diagnostics); + + if (gpg->encrypted_to) + g_object_unref (gpg->encrypted_to); + + if (gpg->signatures) + g_object_unref (gpg->signatures); + + g_slice_free (struct _GpgCtx, gpg); +} + +static const char * +gpg_digest_str (GMimeDigestAlgo digest) +{ + switch (digest) { + case GMIME_DIGEST_ALGO_MD2: + return "--digest-algo=MD2"; + case GMIME_DIGEST_ALGO_MD5: + return "--digest-algo=MD5"; + case GMIME_DIGEST_ALGO_SHA1: + return "--digest-algo=SHA1"; + case GMIME_DIGEST_ALGO_SHA224: + return "--digest-algo=SHA224"; + case GMIME_DIGEST_ALGO_SHA256: + return "--digest-algo=SHA256"; + case GMIME_DIGEST_ALGO_SHA384: + return "--digest-algo=SHA384"; + case GMIME_DIGEST_ALGO_SHA512: + return "--digest-algo=SHA512"; + case GMIME_DIGEST_ALGO_RIPEMD160: + return "--digest-algo=RIPEMD160"; + case GMIME_DIGEST_ALGO_TIGER192: + return "--digest-algo=TIGER192"; + case GMIME_DIGEST_ALGO_MD4: + return "--digest-algo=MD4"; + default: + return NULL; + } +} + +static char ** +gpg_ctx_get_argv (struct _GpgCtx *gpg, int status_fd, int secret_fd, char ***strv) +{ + const char *digest_str; + char **argv, *buf; + GPtrArray *args; + int v = 0; + guint i; + + *strv = g_new (char *, 3); + + args = g_ptr_array_new (); + g_ptr_array_add (args, "gpg"); + + g_ptr_array_add (args, "--verbose"); + g_ptr_array_add (args, "--no-secmem-warning"); + g_ptr_array_add (args, "--no-greeting"); + g_ptr_array_add (args, "--no-tty"); + + if (!gpg->need_passwd) { + /* only use batch mode if we don't intend on using the + interactive --command-fd option to send it the + user's password */ + g_ptr_array_add (args, "--batch"); + g_ptr_array_add (args, "--yes"); + } + + g_ptr_array_add (args, "--charset=UTF-8"); + + (*strv)[v++] = buf = g_strdup_printf ("--status-fd=%d", status_fd); + g_ptr_array_add (args, buf); + + if (gpg->need_passwd) { + (*strv)[v++] = buf = g_strdup_printf ("--command-fd=%d", secret_fd); + g_ptr_array_add (args, buf); + } + + switch (gpg->mode) { + case GPG_CTX_MODE_SIGN: + if (gpg->use_agent) + g_ptr_array_add (args, "--use-agent"); + + g_ptr_array_add (args, "--sign"); + g_ptr_array_add (args, "--detach"); + if (gpg->armor) + g_ptr_array_add (args, "--armor"); + if ((digest_str = gpg_digest_str (gpg->digest))) + g_ptr_array_add (args, (char *) digest_str); + if (gpg->userid) { + g_ptr_array_add (args, "-u"); + g_ptr_array_add (args, (char *) gpg->userid); + } + g_ptr_array_add (args, "--output"); + g_ptr_array_add (args, "-"); + break; + case GPG_CTX_MODE_VERIFY: + if (!gpg->ctx->auto_key_retrieve) { + g_ptr_array_add (args, "--keyserver-options"); + g_ptr_array_add (args, "no-auto-key-retrieve"); + } + + g_ptr_array_add (args, "--enable-special-filenames"); + g_ptr_array_add (args, "--verify"); + g_ptr_array_add (args, "--"); + + /* signature stream must come first */ + (*strv)[v++] = buf = g_strdup_printf ("-&%d", secret_fd); + g_ptr_array_add (args, buf); + + /* followed by the content stream (in this case, stdin) */ + g_ptr_array_add (args, "-"); + break; + case GPG_CTX_MODE_SIGN_ENCRYPT: + if (gpg->use_agent) + g_ptr_array_add (args, "--use-agent"); + + g_ptr_array_add (args, "--sign"); + + if ((digest_str = gpg_digest_str (gpg->digest))) + g_ptr_array_add (args, (char *) digest_str); + + /* fall thru... */ + case GPG_CTX_MODE_ENCRYPT: + g_ptr_array_add (args, "--encrypt"); + + if (gpg->armor) + g_ptr_array_add (args, "--armor"); + + if (gpg->always_trust) + g_ptr_array_add (args, "--always-trust"); + + if (gpg->userid) { + g_ptr_array_add (args, "-u"); + g_ptr_array_add (args, (char *) gpg->userid); + } + + if (gpg->recipients) { + for (i = 0; i < gpg->recipients->len; i++) { + g_ptr_array_add (args, "-r"); + g_ptr_array_add (args, gpg->recipients->pdata[i]); + } + } + g_ptr_array_add (args, "--output"); + g_ptr_array_add (args, "-"); + break; + case GPG_CTX_MODE_DECRYPT: + if (gpg->use_agent) + g_ptr_array_add (args, "--use-agent"); + + g_ptr_array_add (args, "--decrypt"); + g_ptr_array_add (args, "--output"); + g_ptr_array_add (args, "-"); + break; + case GPG_CTX_MODE_IMPORT: + g_ptr_array_add (args, "--import"); + g_ptr_array_add (args, "-"); + break; + case GPG_CTX_MODE_EXPORT: + if (gpg->armor) + g_ptr_array_add (args, "--armor"); + g_ptr_array_add (args, "--export"); + for (i = 0; i < gpg->recipients->len; i++) + g_ptr_array_add (args, gpg->recipients->pdata[i]); + break; + } + +#if d(!)0 + for (i = 0; i < args->len; i++) + printf ("%s ", (char *) args->pdata[i]); + printf ("\n"); +#endif + + g_ptr_array_add (args, NULL); + (*strv)[v] = NULL; + + argv = (char **) args->pdata; + g_ptr_array_free (args, FALSE); + + return argv; +} + +static int +gpg_ctx_op_start (struct _GpgCtx *gpg) +{ + int i, maxfd, errnosave, fds[10]; + char **argv, **strv = NULL; + int flags; + + for (i = 0; i < 10; i++) + fds[i] = -1; + + maxfd = (gpg->need_passwd || gpg->sigstream) ? 10 : 8; + for (i = 0; i < maxfd; i += 2) { + if (pipe (fds + i) == -1) + goto exception; + } + + argv = gpg_ctx_get_argv (gpg, fds[7], fds[8], &strv); + + if (!(gpg->pid = fork ())) { + /* child process */ + + if ((dup2 (fds[0], STDIN_FILENO) < 0) || + (dup2 (fds[3], STDOUT_FILENO) < 0) || + (dup2 (fds[5], STDERR_FILENO) < 0)) { + _exit (255); + } + + /* Dissociate from gmime's controlling terminal so + * that gpg won't be able to read from it. + */ + setsid (); + + maxfd = sysconf (_SC_OPEN_MAX); + for (i = 3; i < maxfd; i++) { + /* don't close the status-fd or the passwd-fd */ + if (i != fds[7] && i != fds[8]) + fcntl (i, F_SETFD, FD_CLOEXEC); + } + + /* run gpg */ + execvp (gpg->ctx->path, argv); + _exit (255); + } else if (gpg->pid < 0) { + g_strfreev (strv); + g_free (argv); + goto exception; + } + + /* parent process */ + + g_strfreev (strv); + g_free (argv); + + close (fds[0]); + gpg->stdin_fd = fds[1]; + gpg->stdout_fd = fds[2]; + close (fds[3]); + gpg->stderr_fd = fds[4]; + close (fds[5]); + gpg->status_fd = fds[6]; + close (fds[7]); + + if (fds[8] != -1) { + flags = (flags = fcntl (fds[9], F_GETFL)) == -1 ? O_WRONLY : flags; + fcntl (fds[9], F_SETFL, flags | O_NONBLOCK); + gpg->secret_fd = fds[9]; + close (fds[8]); + } + + flags = (flags = fcntl (gpg->stdin_fd, F_GETFL)) == -1 ? O_WRONLY : flags; + fcntl (gpg->stdin_fd, F_SETFL, flags | O_NONBLOCK); + + flags = (flags = fcntl (gpg->stdout_fd, F_GETFL)) == -1 ? O_RDONLY : flags; + fcntl (gpg->stdout_fd, F_SETFL, flags | O_NONBLOCK); + + flags = (flags = fcntl (gpg->stderr_fd, F_GETFL)) == -1 ? O_RDONLY : flags; + fcntl (gpg->stderr_fd, F_SETFL, flags | O_NONBLOCK); + + flags = (flags = fcntl (gpg->status_fd, F_GETFL)) == -1 ? O_RDONLY : flags; + fcntl (gpg->status_fd, F_SETFL, flags | O_NONBLOCK); + + return 0; + + exception: + + errnosave = errno; + + for (i = 0; i < maxfd; i++) { + if (fds[i] != -1) + close (fds[i]); + } + + errno = errnosave; + + return -1; +} + +static char * +next_token (char *in, char **token) +{ + char *start, *inptr = in; + + while (*inptr == ' ') + inptr++; + + if (*inptr == '\0' || *inptr == '\n') { + if (token) + *token = NULL; + return inptr; + } + + start = inptr; + while (*inptr && *inptr != ' ' && *inptr != '\n') + inptr++; + + if (token) + *token = g_strndup (start, (size_t) (inptr - start)); + + return inptr; +} + +/** + * gpg_ctx_add_signature: + * @gpg: GnuPG context + * @status: a #GMimeSignatureStatus + * @info: a string with the signature info + * + * Parses GOODSIG, BADSIG, EXPSIG, EXPKEYSIG, and REVKEYSIG status messages + * into a newly allocated #GMimeSignature and adds it to @gpg's signature list. + **/ +static void +gpg_ctx_add_signature (struct _GpgCtx *gpg, GMimeSignatureStatus status, char *info) +{ + GMimeSignature *sig; + + if (!gpg->signatures) + gpg->signatures = g_mime_signature_list_new (); + + gpg->signature = sig = g_mime_signature_new (); + g_mime_signature_set_status (sig, status); + g_mime_signature_list_add (gpg->signatures, sig); + g_object_unref (sig); + + /* get the key id of the signer */ + info = next_token (info, &sig->cert->keyid); + + /* the rest of the string is the signer's name */ + sig->cert->name = g_strdup (info); +} + +static void +gpg_ctx_parse_signer_info (struct _GpgCtx *gpg, char *status) +{ + GMimeSignature *sig; + char *inend; + + if (!strncmp (status, "SIG_ID ", 7)) { + /* not sure if this contains anything we care about... */ + } else if (!strncmp (status, "GOODSIG ", 8)) { + gpg_ctx_add_signature (gpg, GMIME_SIGNATURE_STATUS_GOOD, status + 8); + } else if (!strncmp (status, "BADSIG ", 7)) { + gpg_ctx_add_signature (gpg, GMIME_SIGNATURE_STATUS_BAD, status + 7); + } else if (!strncmp (status, "EXPSIG ", 7)) { + gpg_ctx_add_signature (gpg, GMIME_SIGNATURE_STATUS_ERROR, status + 7); + gpg->signature->errors |= GMIME_SIGNATURE_ERROR_EXPSIG; + } else if (!strncmp (status, "EXPKEYSIG ", 10)) { + gpg_ctx_add_signature (gpg, GMIME_SIGNATURE_STATUS_ERROR, status + 10); + gpg->signature->errors |= GMIME_SIGNATURE_ERROR_EXPKEYSIG; + } else if (!strncmp (status, "REVKEYSIG ", 10)) { + gpg_ctx_add_signature (gpg, GMIME_SIGNATURE_STATUS_ERROR, status + 10); + gpg->signature->errors |= GMIME_SIGNATURE_ERROR_REVKEYSIG; + } else if (!strncmp (status, "ERRSIG ", 7)) { + /* Note: NO_PUBKEY often comes after an ERRSIG */ + status += 7; + + if (!gpg->signatures) + gpg->signatures = g_mime_signature_list_new (); + + gpg->signature = sig = g_mime_signature_new (); + g_mime_signature_set_status (sig, GMIME_SIGNATURE_STATUS_ERROR); + g_mime_signature_list_add (gpg->signatures, sig); + g_object_unref (sig); + + /* get the key id of the signer */ + status = next_token (status, &sig->cert->keyid); + + /* the second token is the public-key algorithm id */ + sig->cert->pubkey_algo = strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + sig->cert->pubkey_algo = 0; + return; + } + + status = inend + 1; + + /* the third token is the digest algorithm id */ + sig->cert->digest_algo = strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + sig->cert->digest_algo = 0; + return; + } + + status = inend + 1; + + /* the fourth token is the signature class */ + /*sig->sig_class =*/ strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + /*signer->sig_class = 0;*/ + return; + } + + status = inend + 1; + + /* the fifth token is the signature expiration date (or 0 for never) */ + sig->expires = strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + sig->expires = 0; + return; + } + + status = inend + 1; + + /* the sixth token is the return code */ + switch (strtol (status, NULL, 10)) { + case 4: sig->errors |= GMIME_SIGNATURE_ERROR_UNSUPP_ALGO; break; + case 9: sig->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY; break; + default: break; + } + } else if (!strncmp (status, "NO_PUBKEY ", 10)) { + /* the only token is the keyid, but we've already got it */ + gpg->signature->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY; + } else if (!strncmp (status, "VALIDSIG ", 9)) { + sig = gpg->signature; + status += 9; + + /* the first token is the fingerprint */ + status = next_token (status, &sig->cert->fingerprint); + + /* the second token is the date the stream was signed YYYY-MM-DD */ + status = next_token (status, NULL); + + /* the third token is the signature creation date (or 0 for unknown?) */ + sig->created = strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + sig->created = 0; + return; + } + + status = inend + 1; + + /* the fourth token is the signature expiration date (or 0 for never) */ + sig->expires = strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + sig->expires = 0; + return; + } + + status = inend + 1; + + /* the fifth token is the signature version */ + /*sig->sig_ver =*/ strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + /*signer->sig_ver = 0;*/ + return; + } + + status = inend + 1; + + /* the sixth token is a reserved numeric value (ignore for now) */ + status = next_token (status, NULL); + + /* the seventh token is the public-key algorithm id */ + sig->cert->pubkey_algo = strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + sig->cert->pubkey_algo = 0; + return; + } + + status = inend + 1; + + /* the eighth token is the digest algorithm id */ + sig->cert->digest_algo = strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + sig->cert->digest_algo = 0; + return; + } + + status = inend + 1; + + /* the nineth token is the signature class */ + /*sig->sig_class =*/ strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + /*sig->sig_class = 0;*/ + return; + } + + status = inend + 1; + + /* the rest is the primary key fingerprint */ + } else if (!strncmp (status, "TRUST_", 6)) { + status += 6; + + sig = gpg->signature; + if (!strncmp (status, "NEVER", 5)) { + sig->cert->trust = GMIME_CERTIFICATE_TRUST_NEVER; + } else if (!strncmp (status, "MARGINAL", 8)) { + sig->cert->trust = GMIME_CERTIFICATE_TRUST_MARGINAL; + } else if (!strncmp (status, "FULLY", 5)) { + sig->cert->trust = GMIME_CERTIFICATE_TRUST_FULLY; + } else if (!strncmp (status, "ULTIMATE", 8)) { + sig->cert->trust = GMIME_CERTIFICATE_TRUST_ULTIMATE; + } else if (!strncmp (status, "UNDEFINED", 9)) { + sig->cert->trust = GMIME_CERTIFICATE_TRUST_UNDEFINED; + } + } +} + +static int +gpg_ctx_parse_status (struct _GpgCtx *gpg, GError **err) +{ + size_t nread, nwritten; + register char *inptr; + char *status, *tmp; + int len; + + parse: + + g_clear_error (err); + + inptr = gpg->statusbuf; + while (inptr < gpg->statusptr && *inptr != '\n') + inptr++; + + if (*inptr != '\n') { + /* we don't have enough data buffered to parse this status line */ + return 0; + } + + *inptr++ = '\0'; + status = gpg->statusbuf; + + d(printf ("status: %s\n", status)); + + if (strncmp (status, "[GNUPG:] ", 9) != 0) { + if (!gpg->utf8) + tmp = g_locale_to_utf8 (status, -1, &nread, &nwritten, NULL); + else + tmp = status; + + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Unexpected GnuPG status message encountered:\n\n%s"), + tmp); + + if (!gpg->utf8) + g_free (tmp); + + return -1; + } + + status += 9; + + if (!strncmp (status, "USERID_HINT ", 12)) { + size_t nread, nwritten; + char *hint, *user; + + status += 12; + + status = next_token (status, &hint); + if (!hint) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Failed to parse gpg userid hint.")); + return -1; + } + + if (g_hash_table_lookup (gpg->userid_hint, hint)) { + /* we already have this userid hint... */ + g_free (hint); + goto recycle; + } + + if (gpg->utf8 || !(user = g_locale_to_utf8 (status, -1, &nread, &nwritten, NULL))) + user = g_strdup (status); + + g_strstrip (user); + + g_hash_table_insert (gpg->userid_hint, hint, user); + } else if (!strncmp (status, "NEED_PASSPHRASE ", 16)) { + char *userid; + + status += 16; + + status = next_token (status, &userid); + if (!userid) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Failed to parse gpg passphrase request.")); + return -1; + } + + g_free (gpg->need_id); + gpg->need_id = userid; + } else if (!strncmp (status, "NEED_PASSPHRASE_PIN ", 20)) { + char *userid; + + status += 20; + + status = next_token (status, &userid); + if (!userid) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Failed to parse gpg passphrase request.")); + return -1; + } + + g_free (gpg->need_id); + gpg->need_id = userid; + } else if (!strncmp (status, "GET_HIDDEN ", 11)) { + GMimeStream *filtered_stream, *passwd; + GMimeCryptoContext *ctx; + GMimeFilter *filter; + const char *charset; + char *prompt = NULL; + const char *name; + gboolean ok; + + status += 11; + + ctx = (GMimeCryptoContext *) gpg->ctx; + if (!ctx->request_passwd) { + /* can't ask for a passwd w/o a way to request it from the user... */ + g_set_error_literal (err, GMIME_ERROR, ECANCELED, _("Canceled.")); + return -1; + } + + if (!(name = g_hash_table_lookup (gpg->userid_hint, gpg->need_id))) + name = gpg->userid; + + if (!strncmp (status, "passphrase.pin.ask", 18)) { + prompt = g_strdup_printf (_("You need a PIN to unlock the key for your\n" + "SmartCard: \"%s\""), name); + } else if (!strncmp (status, "passphrase.enter", 16)) { + prompt = g_strdup_printf (_("You need a passphrase to unlock the key for\n" + "user: \"%s\""), name); + } else { + next_token (status, &prompt); + g_set_error (err, GMIME_ERROR, GMIME_ERROR_GENERAL, + _("Unexpected request from GnuPG for `%s'"), prompt); + g_free (prompt); + return -1; + } + + /* create a stream for the application to write the passwd to */ + passwd = g_mime_stream_pipe_new (gpg->secret_fd); + g_mime_stream_pipe_set_owner ((GMimeStreamPipe *) passwd, FALSE); + + if (!gpg->utf8) { + /* we'll need to transcode the UTF-8 password that the application + * will write to our stream into the locale charset used by gpg */ + filtered_stream = g_mime_stream_filter_new (passwd); + g_object_unref (passwd); + + charset = g_mime_locale_charset (); + filter = g_mime_filter_charset_new ("UTF-8", charset); + + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered_stream, filter); + g_object_unref (filter); + + passwd = filtered_stream; + } + + if ((ok = ctx->request_passwd (ctx, name, prompt, gpg->bad_passwds > 0, passwd, err))) { + if (g_mime_stream_flush (passwd) == -1) + ok = FALSE; + } + + g_object_unref (passwd); + g_free (prompt); + + if (!ok) + return -1; + } else if (!strncmp (status, "GOOD_PASSPHRASE", 15)) { + gpg->bad_passwds = 0; + } else if (!strncmp (status, "BAD_PASSPHRASE", 14)) { + gpg->bad_passwds++; + + if (gpg->bad_passwds == 3) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_BAD_PASSWORD, + _("Failed to unlock secret key: 3 bad passphrases given.")); + return -1; + } + } else if (!strncmp (status, "UNEXPECTED ", 11)) { + /* this is an error */ + if (!gpg->utf8) + tmp = g_locale_to_utf8 (status + 11, -1, &nread, &nwritten, NULL); + else + tmp = status + 11; + + g_set_error (err, GMIME_ERROR, GMIME_ERROR_GENERAL, + _("Unexpected response from GnuPG: %s"), + tmp); + + if (!gpg->utf8) + g_free (tmp); + + return -1; + } else if (!strncmp (status, "NODATA", 6)) { + /* this is an error */ + const char *diagnostics; + + diagnostics = gpg_ctx_get_diagnostics (gpg); + if (diagnostics && *diagnostics) + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_GENERAL, diagnostics); + else + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_GENERAL, _("No data provided")); + + return -1; + } else { + GMimeCertificate *cert; + char *inend; + + switch (gpg->mode) { + case GPG_CTX_MODE_SIGN: + if (strncmp (status, "SIG_CREATED ", 12) != 0) + break; + + status += 12; + + /* skip the next single-char token ("D" for detached) */ + status = next_token (status, NULL); + + /* skip the public-key algorithm id token */ + status = next_token (status, NULL); + + /* this token is the digest algorithm used */ + gpg->digest = strtoul (status, NULL, 10); + break; + case GPG_CTX_MODE_VERIFY: + gpg_ctx_parse_signer_info (gpg, status); + break; + case GPG_CTX_MODE_SIGN_ENCRYPT: + case GPG_CTX_MODE_ENCRYPT: + if (!strncmp (status, "BEGIN_ENCRYPTION", 16)) { + /* nothing to do... but we know to expect data on stdout soon */ + } else if (!strncmp (status, "END_ENCRYPTION", 14)) { + /* nothing to do, but we know the end is near? */ + } else if (!strncmp (status, "NO_RECP", 7)) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NO_VALID_RECIPIENTS, + _("Failed to encrypt: No valid recipients specified.")); + return -1; + } + break; + case GPG_CTX_MODE_DECRYPT: + if (!strncmp (status, "BEGIN_DECRYPTION", 16)) { + /* nothing to do... but we know to expect data on stdout soon */ + } else if (!strncmp (status, "DECRYPTION_INFO ", 16)) { + /* new feature added in gnupg-2.1.x which gives mdc and cipher algorithms used */ + status += 16; + + /* first token is the mdc algorithm (or 0 if not used) */ + gpg->digest = strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + gpg->digest = 0; + break; + } + + status = inend + 1; + + /* second token is the cipher algorithm */ + gpg->cipher = strtoul (status, &inend, 10); + } else if (!strncmp (status, "DECRYPTION_OKAY", 15)) { + /* decryption succeeded */ + gpg->decrypt_okay = TRUE; + } else if (!strncmp (status, "DECRYPTION_FAILED", 17)) { + /* nothing to do... but we know gpg failed to decrypt :-( */ + } else if (!strncmp (status, "END_DECRYPTION", 14)) { + /* nothing to do, but we know we're done */ + } else if (!strncmp (status, "ENC_TO ", 7)) { + /* parse the recipient info */ + if (!gpg->encrypted_to) + gpg->encrypted_to = g_mime_certificate_list_new (); + + cert = g_mime_certificate_new (); + g_mime_certificate_list_add (gpg->encrypted_to, cert); + + status += 7; + + /* first token is the recipient's keyid */ + status = next_token (status, &cert->keyid); + + /* second token is the recipient's pubkey algo */ + cert->pubkey_algo = strtoul (status, &inend, 10); + if (inend == status || *inend != ' ') { + cert->pubkey_algo = 0; + g_object_unref (cert); + break; + } + + g_object_unref (cert); + status = inend + 1; + + /* third token is a dummy value which is always '0' */ + } else if (!strncmp (status, "GOODMDC", 7)) { + /* nothing to do... we'll grab the MDC used in DECRYPTION_INFO */ + } else if (!strncmp (status, "BADMDC", 6)) { + /* nothing to do, this will only be sent after DECRYPTION_FAILED */ + } else { + gpg_ctx_parse_signer_info (gpg, status); + } + break; + case GPG_CTX_MODE_IMPORT: + /* no-op */ + break; + case GPG_CTX_MODE_EXPORT: + /* no-op */ + break; + } + } + + recycle: + + /* recycle our statusbuf by moving inptr to the beginning of statusbuf */ + len = gpg->statusptr - inptr; + memmove (gpg->statusbuf, inptr, len); + + len = inptr - gpg->statusbuf; + gpg->statusleft += len; + gpg->statusptr -= len; + + /* if we have more data, try parsing the next line? */ + if (gpg->statusptr > gpg->statusbuf) + goto parse; + + return 0; +} + +#ifdef ALLOC_NEAREST_POW2 +static inline size_t +nearest_pow (size_t num) +{ + size_t n; + + if (num == 0) + return 0; + + n = num - 1; +#if defined (__GNUC__) && defined (__i386__) + __asm__("bsrl %1,%0\n\t" + "jnz 1f\n\t" + "movl $-1,%0\n" + "1:" : "=r" (n) : "rm" (n)); + n = (1 << (n + 1)); +#else + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; +#endif + + return n; +} + +#define next_alloc_size(n) nearest_pow (n) +#else +static inline size_t +next_alloc_size (size_t n) +{ + return (n + 63) & ~63; +} +#endif + +#define status_backup(gpg, start, len) G_STMT_START { \ + if (gpg->statusleft <= len) { \ + size_t slen, soff; \ + \ + soff = gpg->statusptr - gpg->statusbuf; \ + slen = next_alloc_size (soff + len + 1); \ + \ + gpg->statusbuf = g_realloc (gpg->statusbuf, slen); \ + gpg->statusptr = gpg->statusbuf + soff; \ + gpg->statusleft = (slen - 1) - soff; \ + } \ + \ + memcpy (gpg->statusptr, start, len); \ + gpg->statusptr += len; \ + gpg->statusleft -= len; \ +} G_STMT_END + +enum { + GPG_STDIN_FD, + GPG_STDOUT_FD, + GPG_STDERR_FD, + GPG_STATUS_FD, + GPG_VERIFY_FD, + GPG_N_FDS +}; + +#ifndef HAVE_POLL +struct pollfd { + int fd; + short events; + short revents; +}; + +#define POLLIN (1 << 0) +#define POLLPRI (1 << 1) +#define POLLOUT (1 << 2) +#define POLLERR (1 << 3) +#define POLLHUP (1 << 4) +#define POLLNVAL (1 << 5) + +#ifdef HAVE_SELECT +static int +poll (struct pollfd *pfds, nfds_t nfds, int timeout) +{ + fd_set rset, wset, xset; + struct timeval tv; + int maxfd = 0; + int ready; + nfds_t i; + + if (nfds == 0) + return 0; + + /* initialize our select() timeout */ + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; + + /* initialize our select() fd sets */ + FD_ZERO (&rset); + FD_ZERO (&wset); + FD_ZERO (&xset); + + for (i = 0; i < nfds; i++) { + pfds[i].revents = 0; + if (pfds[i].fd < 0) + continue; + + if (pfds[i].events & POLLIN) + FD_SET (pfds[i].fd, &rset); + if (pfds[i].events & POLLOUT) + FD_SET (pfds[i].fd, &wset); + if (pfds[i].events != 0) + FD_SET (pfds[i].fd, &xset); + if (pfds[i].fd > maxfd) + maxfd = pfds[i].fd; + } + + /* poll our fds... */ + if ((ready = select (maxfd + 1, &rset, &wset, &xset, timeout != -1 ? &tv : NULL)) > 0) { + ready = 0; + + for (i = 0; i < nfds; i++) { + if (pfds[i].fd < 0) + continue; + + if (FD_ISSET (pfds[i].fd, &rset)) + pfds[i].revents |= POLLIN; + if (FD_ISSET (pfds[i].fd, &wset)) + pfds[i].revents |= POLLOUT; + if (FD_ISSET (pfds[i].fd, &xset)) + pfds[i].revents |= POLLERR | POLLHUP; + + if (pfds[i].revents != 0) + ready++; + } + } + + return ready; +} +#else +static int +poll (struct pollfd *pfds, nfds_t nfds, int timeout) +{ + errno = EIO; + return -1; +} +#endif /* HAVE_SELECT */ +#endif /* ! HAVE_POLL */ + +static int +gpg_ctx_op_step (struct _GpgCtx *gpg, GError **err) +{ + const char *diagnostics, *mode; + struct pollfd pfds[GPG_N_FDS]; + int ready, save; + nfds_t n; + + for (n = 0; n < GPG_N_FDS; n++) { + pfds[n].events = 0; + pfds[n].fd = -1; + } + + if (!gpg->seen_eof1) { + pfds[GPG_STDOUT_FD].fd = gpg->stdout_fd; + pfds[GPG_STDOUT_FD].events = POLLIN; + } + + if (!gpg->seen_eof2) { + pfds[GPG_STDERR_FD].fd = gpg->stderr_fd; + pfds[GPG_STDERR_FD].events = POLLIN; + } + + if (!gpg->complete) { + pfds[GPG_STATUS_FD].fd = gpg->status_fd; + pfds[GPG_STATUS_FD].events = POLLIN; + } + + pfds[GPG_STDIN_FD].fd = gpg->stdin_fd; + pfds[GPG_STDIN_FD].events = POLLOUT; + + if (gpg->mode == GPG_CTX_MODE_VERIFY) { + pfds[GPG_VERIFY_FD].fd = gpg->secret_fd; + pfds[GPG_VERIFY_FD].events = POLLOUT; + } + + do { + for (n = 0; n < GPG_N_FDS; n++) + pfds[n].revents = 0; + ready = poll (pfds, GPG_N_FDS, 10 * 1000); + } while (ready == -1 && errno == EINTR); + + if (ready == -1) { + d(printf ("poll() failed: %s\n", g_strerror (errno))); + goto exception; + } else if (ready == 0) { + /* timed out */ + return 0; + } + + /* Test each and every file descriptor to see if it's 'ready', + and if so - do what we can with it and then drop through to + the next file descriptor and so on until we've done what we + can to all of them. If one fails along the way, return + -1. */ + + if (pfds[GPG_STATUS_FD].revents & (POLLIN | POLLHUP)) { + /* read the status message and decide what to do... */ + char buffer[4096]; + ssize_t nread; + + d(printf ("reading from gpg's status-fd...\n")); + + do { + nread = read (gpg->status_fd, buffer, sizeof (buffer)); + } while (nread == -1 && (errno == EINTR || errno == EAGAIN)); + + if (nread == -1) + goto exception; + + if (nread > 0) { + status_backup (gpg, buffer, (size_t) nread); + if (gpg_ctx_parse_status (gpg, err) == -1) + return -1; + } else { + gpg->complete = TRUE; + } + } + + if ((pfds[GPG_STDOUT_FD].revents & (POLLIN | POLLHUP)) && gpg->ostream) { + char buffer[4096]; + ssize_t nread; + + d(printf ("reading gpg's stdout...\n")); + + do { + nread = read (gpg->stdout_fd, buffer, sizeof (buffer)); + } while (nread == -1 && (errno == EINTR || errno == EAGAIN)); + + if (nread == -1) + goto exception; + + if (nread > 0) { + if (g_mime_stream_write (gpg->ostream, buffer, (size_t) nread) == -1) + goto exception; + } else { + gpg->seen_eof1 = TRUE; + } + } + + if (pfds[GPG_STDERR_FD].revents & (POLLIN | POLLHUP)) { + char buffer[4096]; + ssize_t nread; + + d(printf ("reading gpg's stderr...\n")); + + do { + nread = read (gpg->stderr_fd, buffer, sizeof (buffer)); + } while (nread == -1 && (errno == EINTR || errno == EAGAIN)); + + if (nread == -1) + goto exception; + + if (nread > 0) { + g_mime_stream_write (gpg->diagnostics, buffer, nread); + } else { + gpg->seen_eof2 = TRUE; + } + } + + if ((pfds[GPG_VERIFY_FD].revents & (POLLOUT | POLLHUP))) { + char buffer[4096]; + ssize_t nread; + + d(printf ("streaming digital signature to gpg...\n")); + + /* write our signature stream to gpg's special fd */ + nread = g_mime_stream_read (gpg->sigstream, buffer, sizeof (buffer)); + if (nread > 0) { + ssize_t w, nwritten = 0; + + do { + do { + w = write (gpg->secret_fd, buffer + nwritten, nread - nwritten); + } while (w == -1 && (errno == EINTR || errno == EAGAIN)); + + if (w > 0) + nwritten += w; + } while (nwritten < nread && w != -1); + + if (w == -1) + goto exception; + } + + if (g_mime_stream_eos (gpg->sigstream)) { + close (gpg->secret_fd); + gpg->secret_fd = -1; + } + } + + if ((pfds[GPG_STDIN_FD].revents & (POLLOUT | POLLHUP)) && gpg->istream) { + char buffer[4096]; + ssize_t nread; + + d(printf ("writing to gpg's stdin...\n")); + + /* write our stream to gpg's stdin */ + nread = g_mime_stream_read (gpg->istream, buffer, sizeof (buffer)); + if (nread > 0) { + ssize_t w, nwritten = 0; + + do { + do { + w = write (gpg->stdin_fd, buffer + nwritten, nread - nwritten); + } while (w == -1 && (errno == EINTR || errno == EAGAIN)); + + if (w > 0) + nwritten += w; + } while (nwritten < nread && w != -1); + + if (w == -1) + goto exception; + } + + if (g_mime_stream_eos (gpg->istream)) { + close (gpg->stdin_fd); + gpg->stdin_fd = -1; + } + } + + return 0; + + exception: + + switch (gpg->mode) { + case GPG_CTX_MODE_SIGN: + mode = "sign"; + break; + case GPG_CTX_MODE_VERIFY: + mode = "verify"; + break; + case GPG_CTX_MODE_SIGN_ENCRYPT: + case GPG_CTX_MODE_ENCRYPT: + mode = "encrypt"; + break; + case GPG_CTX_MODE_DECRYPT: + mode = "decrypt"; + break; + case GPG_CTX_MODE_IMPORT: + mode = "import keys"; + break; + case GPG_CTX_MODE_EXPORT: + mode = "export keys"; + break; + default: + g_assert_not_reached (); + mode = NULL; + break; + } + + save = errno; + diagnostics = gpg_ctx_get_diagnostics (gpg); + errno = save; + + if (diagnostics && *diagnostics) { + g_set_error (err, GMIME_ERROR, errno, + _("Failed to %s via GnuPG: %s\n\n%s"), + mode, g_strerror (errno), + diagnostics); + } else { + g_set_error (err, GMIME_ERROR, errno, + _("Failed to %s via GnuPG: %s\n"), + mode, g_strerror (errno)); + } + + return -1; +} + +static gboolean +gpg_ctx_op_complete (struct _GpgCtx *gpg) +{ + return gpg->complete && gpg->seen_eof1 && gpg->seen_eof2; +} + +#if 0 +static gboolean +gpg_ctx_op_exited (struct _GpgCtx *gpg) +{ + int status; + + if (waitpid (gpg->pid, &status, WNOHANG) == gpg->pid) { + gpg->exit_status = status; + gpg->exited = TRUE; + return TRUE; + } + + return FALSE; +} +#endif + +static void +gpg_ctx_op_cancel (struct _GpgCtx *gpg) +{ + int status; + + if (gpg->exited) + return; + + kill (gpg->pid, SIGTERM); + sleep (1); + if (waitpid (gpg->pid, &status, WNOHANG) == 0) { + /* no more mr nice guy... */ + kill (gpg->pid, SIGKILL); + sleep (1); + waitpid (gpg->pid, &status, WNOHANG); + } +} + +static int +gpg_ctx_op_wait (struct _GpgCtx *gpg) +{ + int errnosave, status; + sigset_t mask, omask; + pid_t retval; + + if (!gpg->exited) { + sigemptyset (&mask); + sigaddset (&mask, SIGALRM); + sigprocmask (SIG_BLOCK, &mask, &omask); + + alarm (1); + retval = waitpid (gpg->pid, &status, 0); + errnosave = errno; + alarm (0); + + sigprocmask (SIG_SETMASK, &omask, NULL); + errno = errnosave; + + if (retval == (pid_t) -1 && errno == EINTR) { + /* gpg is hanging... */ + kill (gpg->pid, SIGTERM); + sleep (1); + + retval = waitpid (gpg->pid, &status, WNOHANG); + if (retval == (pid_t) 0) { + /* still hanging... */ + kill (gpg->pid, SIGKILL); + sleep (1); + retval = waitpid (gpg->pid, &status, WNOHANG); + } + } + } else { + status = gpg->exit_status; + retval = gpg->pid; + } + + if (retval != (pid_t) -1 && WIFEXITED (status)) + return WEXITSTATUS (status); + else + return -1; +} +#endif /* ENABLE_CRYPTOGRAPHY */ + +static int +gpg_sign (GMimeCryptoContext *context, const char *userid, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *ostream, GError **err) +{ +#ifdef ENABLE_CRYPTOGRAPHY + GMimeGpgContext *ctx = (GMimeGpgContext *) context; + struct _GpgCtx *gpg; + + gpg = gpg_ctx_new (ctx); + gpg_ctx_set_mode (gpg, GPG_CTX_MODE_SIGN); + gpg_ctx_set_use_agent (gpg, ctx->use_agent); + gpg_ctx_set_digest (gpg, digest); + gpg_ctx_set_armor (gpg, TRUE); + gpg_ctx_set_userid (gpg, userid); + gpg_ctx_set_istream (gpg, istream); + gpg_ctx_set_ostream (gpg, ostream); + + if (gpg_ctx_op_start (gpg) == -1) { + g_set_error (err, GMIME_ERROR, errno, + _("Failed to execute gpg: %s"), + errno ? g_strerror (errno) : _("Unknown")); + gpg_ctx_free (gpg); + + return -1; + } + + while (!gpg_ctx_op_complete (gpg)) { + if (gpg_ctx_op_step (gpg, err) == -1) { + gpg_ctx_op_cancel (gpg); + gpg_ctx_free (gpg); + + return -1; + } + } + + if (gpg_ctx_op_wait (gpg) != 0) { + const char *diagnostics; + int save; + + save = errno; + diagnostics = gpg_ctx_get_diagnostics (gpg); + errno = save; + + g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); + gpg_ctx_free (gpg); + + return -1; + } + + /* save the digest used */ + digest = gpg->digest; + + gpg_ctx_free (gpg); + + return digest; +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); + + return -1; +#endif /* ENABLE_CRYPTOGRAPHY */ +} + + +static GMimeSignatureList * +gpg_verify (GMimeCryptoContext *context, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *sigstream, + GError **err) +{ +#ifdef ENABLE_CRYPTOGRAPHY + GMimeGpgContext *ctx = (GMimeGpgContext *) context; + GMimeSignatureList *signatures; + struct _GpgCtx *gpg; + + gpg = gpg_ctx_new (ctx); + gpg_ctx_set_mode (gpg, GPG_CTX_MODE_VERIFY); + gpg_ctx_set_sigstream (gpg, sigstream); + gpg_ctx_set_istream (gpg, istream); + gpg_ctx_set_digest (gpg, digest); + + if (gpg_ctx_op_start (gpg) == -1) { + g_set_error (err, GMIME_ERROR, errno, + _("Failed to execute gpg: %s"), + errno ? g_strerror (errno) : _("Unknown")); + gpg_ctx_free (gpg); + + return NULL; + } + + while (!gpg_ctx_op_complete (gpg)) { + if (gpg_ctx_op_step (gpg, err) == -1) { + gpg_ctx_op_cancel (gpg); + gpg_ctx_free (gpg); + return NULL; + } + } + + /* Only set the GError if we got no signature information from gpg */ + if (gpg_ctx_op_wait (gpg) != 0 && !gpg->signatures) { + const char *diagnostics; + int save; + + save = errno; + diagnostics = gpg_ctx_get_diagnostics (gpg); + errno = save; + + g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); + gpg_ctx_free (gpg); + + return NULL; + } + + signatures = gpg->signatures; + gpg->signatures = NULL; + gpg_ctx_free (gpg); + + return signatures; +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); + + return NULL; +#endif /* ENABLE_CRYPTOGRAPHY */ +} + + +static int +gpg_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid, + GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream, + GMimeStream *ostream, GError **err) +{ +#ifdef ENABLE_CRYPTOGRAPHY + GMimeGpgContext *ctx = (GMimeGpgContext *) context; + struct _GpgCtx *gpg; + guint i; + + gpg = gpg_ctx_new (ctx); + if (sign) { + gpg_ctx_set_mode (gpg, GPG_CTX_MODE_SIGN_ENCRYPT); + gpg_ctx_set_use_agent (gpg, ctx->use_agent); + } else { + gpg_ctx_set_mode (gpg, GPG_CTX_MODE_ENCRYPT); + } + + gpg_ctx_set_always_trust (gpg, ctx->always_trust); + gpg_ctx_set_digest (gpg, digest); + gpg_ctx_set_armor (gpg, TRUE); + gpg_ctx_set_userid (gpg, userid); + gpg_ctx_set_istream (gpg, istream); + gpg_ctx_set_ostream (gpg, ostream); + + for (i = 0; i < recipients->len; i++) + gpg_ctx_add_recipient (gpg, recipients->pdata[i]); + + if (gpg_ctx_op_start (gpg) == -1) { + g_set_error (err, GMIME_ERROR, errno, + _("Failed to execute gpg: %s"), + errno ? g_strerror (errno) : _("Unknown")); + gpg_ctx_free (gpg); + + return -1; + } + + while (!gpg_ctx_op_complete (gpg)) { + if (gpg_ctx_op_step (gpg, err) == -1) { + gpg_ctx_op_cancel (gpg); + gpg_ctx_free (gpg); + + return -1; + } + } + + if (gpg_ctx_op_wait (gpg) != 0) { + const char *diagnostics; + int save; + + save = errno; + diagnostics = gpg_ctx_get_diagnostics (gpg); + errno = save; + + g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); + gpg_ctx_free (gpg); + + return -1; + } + + gpg_ctx_free (gpg); + + return 0; +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); + + return -1; +#endif /* ENABLE_CRYPTOGRAPHY */ +} + + +static GMimeDecryptResult * +gpg_decrypt (GMimeCryptoContext *context, GMimeStream *istream, + GMimeStream *ostream, GError **err) +{ +#ifdef ENABLE_CRYPTOGRAPHY + GMimeGpgContext *ctx = (GMimeGpgContext *) context; + GMimeDecryptResult *result; + const char *diagnostics; + struct _GpgCtx *gpg; + int save; + + gpg = gpg_ctx_new (ctx); + gpg_ctx_set_mode (gpg, GPG_CTX_MODE_DECRYPT); + gpg_ctx_set_use_agent (gpg, ctx->use_agent); + gpg_ctx_set_istream (gpg, istream); + gpg_ctx_set_ostream (gpg, ostream); + + if (gpg_ctx_op_start (gpg) == -1) { + g_set_error (err, GMIME_ERROR, errno, + _("Failed to execute gpg: %s"), + errno ? g_strerror (errno) : _("Unknown")); + gpg_ctx_free (gpg); + + return NULL; + } + + while (!gpg_ctx_op_complete (gpg)) { + if (gpg_ctx_op_step (gpg, err) == -1) { + gpg_ctx_op_cancel (gpg); + gpg_ctx_free (gpg); + + return NULL; + } + } + + if (gpg_ctx_op_wait (gpg) != 0 && !gpg->decrypt_okay) { + save = errno; + diagnostics = gpg_ctx_get_diagnostics (gpg); + errno = save; + + g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); + gpg_ctx_free (gpg); + + return NULL; + } + + result = g_mime_decrypt_result_new (); + result->recipients = gpg->encrypted_to; + result->signatures = gpg->signatures; + result->cipher = gpg->cipher; + result->mdc = gpg->digest; + gpg->encrypted_to = NULL; + gpg->signatures = NULL; + + gpg_ctx_free (gpg); + + return result; +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); + + return NULL; +#endif /* ENABLE_CRYPTOGRAPHY */ +} + +static int +gpg_import_keys (GMimeCryptoContext *context, GMimeStream *istream, GError **err) +{ +#ifdef ENABLE_CRYPTOGRAPHY + GMimeGpgContext *ctx = (GMimeGpgContext *) context; + struct _GpgCtx *gpg; + + gpg = gpg_ctx_new (ctx); + gpg_ctx_set_mode (gpg, GPG_CTX_MODE_IMPORT); + gpg_ctx_set_istream (gpg, istream); + + if (gpg_ctx_op_start (gpg) == -1) { + g_set_error (err, GMIME_ERROR, errno, + _("Failed to execute gpg: %s"), + errno ? g_strerror (errno) : _("Unknown")); + gpg_ctx_free (gpg); + + return -1; + } + + while (!gpg_ctx_op_complete (gpg)) { + if (gpg_ctx_op_step (gpg, err) == -1) { + gpg_ctx_op_cancel (gpg); + gpg_ctx_free (gpg); + + return -1; + } + } + + if (gpg_ctx_op_wait (gpg) != 0) { + const char *diagnostics; + int save; + + save = errno; + diagnostics = gpg_ctx_get_diagnostics (gpg); + errno = save; + + g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); + gpg_ctx_free (gpg); + + return -1; + } + + gpg_ctx_free (gpg); + + return 0; +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); + + return -1; +#endif /* ENABLE_CRYPTOGRAPHY */ +} + +static int +gpg_export_keys (GMimeCryptoContext *context, GPtrArray *keys, GMimeStream *ostream, GError **err) +{ +#ifdef ENABLE_CRYPTOGRAPHY + GMimeGpgContext *ctx = (GMimeGpgContext *) context; + struct _GpgCtx *gpg; + guint i; + + gpg = gpg_ctx_new (ctx); + gpg_ctx_set_mode (gpg, GPG_CTX_MODE_EXPORT); + gpg_ctx_set_armor (gpg, TRUE); + gpg_ctx_set_ostream (gpg, ostream); + + for (i = 0; i < keys->len; i++) { + gpg_ctx_add_recipient (gpg, keys->pdata[i]); + } + + if (gpg_ctx_op_start (gpg) == -1) { + g_set_error (err, GMIME_ERROR, errno, + _("Failed to execute gpg: %s"), + errno ? g_strerror (errno) : _("Unknown")); + gpg_ctx_free (gpg); + + return -1; + } + + while (!gpg_ctx_op_complete (gpg)) { + if (gpg_ctx_op_step (gpg, err) == -1) { + gpg_ctx_op_cancel (gpg); + gpg_ctx_free (gpg); + + return -1; + } + } + + if (gpg_ctx_op_wait (gpg) != 0) { + const char *diagnostics; + int save; + + save = errno; + diagnostics = gpg_ctx_get_diagnostics (gpg); + errno = save; + + g_set_error_literal (err, GMIME_ERROR, errno, diagnostics); + gpg_ctx_free (gpg); + + return -1; + } + + gpg_ctx_free (gpg); + + return 0; +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("PGP support is not enabled in this build")); + + return -1; +#endif /* ENABLE_CRYPTOGRAPHY */ +} + + +/** + * g_mime_gpg_context_new: + * @request_passwd: a #GMimePasswordRequestFunc + * @path: path to gpg binary + * + * Creates a new gpg crypto context object. + * + * Returns: a new gpg crypto context object. + **/ +GMimeCryptoContext * +g_mime_gpg_context_new (GMimePasswordRequestFunc request_passwd, const char *path) +{ +#ifdef ENABLE_CRYPTOGRAPHY + GMimeCryptoContext *crypto; + GMimeGpgContext *ctx; + + g_return_val_if_fail (path != NULL, NULL); + + ctx = g_object_newv (GMIME_TYPE_GPG_CONTEXT, 0, NULL); + ctx->path = g_strdup (path); + + crypto = (GMimeCryptoContext *) ctx; + crypto->request_passwd = request_passwd; + + return crypto; +#else + return NULL; +#endif /* ENABLE_CRYPTOGRAPHY */ +} + + +/** + * g_mime_gpg_context_get_auto_key_retrieve: + * @ctx: a #GMimeGpgContext + * + * Gets the @auto_key_retrieve flag on the gpg context. + * + * Returns: the @auto_key_retrieve flag on the gpg context. + **/ +gboolean +g_mime_gpg_context_get_auto_key_retrieve (GMimeGpgContext *ctx) +{ + g_return_val_if_fail (GMIME_IS_GPG_CONTEXT (ctx), FALSE); + + return ctx->auto_key_retrieve; +} + + +/** + * g_mime_gpg_context_set_auto_key_retrieve: + * @ctx: a #GMimeGpgContext + * @auto_key_retrieve: auto-retrieve keys from a keys server + * + * Sets the @auto_key_retrieve flag on the gpg context which is used + * for signature verification. + **/ +void +g_mime_gpg_context_set_auto_key_retrieve (GMimeGpgContext *ctx, gboolean auto_key_retrieve) +{ + g_return_if_fail (GMIME_IS_GPG_CONTEXT (ctx)); + + ctx->auto_key_retrieve = auto_key_retrieve; +} + + +/** + * g_mime_gpg_context_get_always_trust: + * @ctx: a #GMimeGpgContext + * + * Gets the always_trust flag on the gpg context. + * + * Returns: the always_trust flag on the gpg context. + **/ +gboolean +g_mime_gpg_context_get_always_trust (GMimeGpgContext *ctx) +{ + g_return_val_if_fail (GMIME_IS_GPG_CONTEXT (ctx), FALSE); + + return ctx->always_trust; +} + + +/** + * g_mime_gpg_context_set_always_trust: + * @ctx: a #GMimeGpgContext + * @always_trust: always trust flag + * + * Sets the @always_trust flag on the gpg context which is used for + * encryption. + **/ +void +g_mime_gpg_context_set_always_trust (GMimeGpgContext *ctx, gboolean always_trust) +{ + g_return_if_fail (GMIME_IS_GPG_CONTEXT (ctx)); + + ctx->always_trust = always_trust; +} + + +/** + * g_mime_gpg_context_get_use_agent: + * @ctx: a #GMimeGpgContext + * + * Gets the use_agent flag on the gpg context. + * + * Returns: the use_agent flag on the gpg context, which indicates + * that GnuPG should attempt to use gpg-agent for credentials. + **/ +gboolean +g_mime_gpg_context_get_use_agent (GMimeGpgContext *ctx) +{ + g_return_val_if_fail (GMIME_IS_GPG_CONTEXT (ctx), FALSE); + + return ctx->use_agent; +} + + +/** + * g_mime_gpg_context_set_use_agent: + * @ctx: a #GMimeGpgContext + * @use_agent: always trust flag + * + * Sets the @use_agent flag on the gpg context, which indicates that + * GnuPG should attempt to use gpg-agent for credentials. + **/ +void +g_mime_gpg_context_set_use_agent (GMimeGpgContext *ctx, gboolean use_agent) +{ + g_return_if_fail (GMIME_IS_GPG_CONTEXT (ctx)); + + ctx->use_agent = use_agent; +} diff --git a/gmime/gmime-gpg-context.h b/gmime/gmime-gpg-context.h new file mode 100644 index 0000000..0d19bf4 --- /dev/null +++ b/gmime/gmime-gpg-context.h @@ -0,0 +1,78 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_GPG_CONTEXT_H__ +#define __GMIME_GPG_CONTEXT_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_GPG_CONTEXT (g_mime_gpg_context_get_type ()) +#define GMIME_GPG_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_GPG_CONTEXT, GMimeGpgContext)) +#define GMIME_GPG_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_GPG_CONTEXT, GMimeGpgContextClass)) +#define GMIME_IS_GPG_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_GPG_CONTEXT)) +#define GMIME_IS_GPG_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_GPG_CONTEXT)) +#define GMIME_GPG_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_GPG_CONTEXT, GMimeGpgContextClass)) + +typedef struct _GMimeGpgContext GMimeGpgContext; +typedef struct _GMimeGpgContextClass GMimeGpgContextClass; + + +/** + * GMimeGpgContext: + * @parent_object: parent #GMimeCryptoContext + * @always_trust: %TRUE if keys should always be trusted + * @path: path to gpg + * + * A GnuPG crypto context. + **/ +struct _GMimeGpgContext { + GMimeCryptoContext parent_object; + gboolean auto_key_retrieve; + gboolean always_trust; + gboolean use_agent; + char *path; +}; + +struct _GMimeGpgContextClass { + GMimeCryptoContextClass parent_class; + +}; + + +GType g_mime_gpg_context_get_type (void); + + +GMimeCryptoContext *g_mime_gpg_context_new (GMimePasswordRequestFunc request_passwd, const char *path); + +gboolean g_mime_gpg_context_get_auto_key_retrieve (GMimeGpgContext *ctx); +void g_mime_gpg_context_set_auto_key_retrieve (GMimeGpgContext *ctx, gboolean auto_key_retrieve); + +gboolean g_mime_gpg_context_get_always_trust (GMimeGpgContext *ctx); +void g_mime_gpg_context_set_always_trust (GMimeGpgContext *ctx, gboolean always_trust); + +gboolean g_mime_gpg_context_get_use_agent (GMimeGpgContext *ctx); +void g_mime_gpg_context_set_use_agent (GMimeGpgContext *ctx, gboolean use_agent); + +G_END_DECLS + +#endif /* __GMIME_GPG_CONTEXT_H__ */ diff --git a/gmime/gmime-header.c b/gmime/gmime-header.c new file mode 100644 index 0000000..030c154 --- /dev/null +++ b/gmime/gmime-header.c @@ -0,0 +1,1035 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gmime-stream-mem.h" +#include "gmime-common.h" +#include "gmime-header.h" +#include "gmime-events.h" +#include "gmime-utils.h" + +#include "list.h" + + +/** + * SECTION: gmime-header + * @title: GMimeHeader + * @short_description: Message and MIME part headers + * @see_also: #GMimeObject + * + * A #GMimeHeader is a collection of rfc822 header fields and their + * values. + **/ + + +/** + * GMimeHeader: + * @next: pointer to the next header + * @prev: pointer to the previous header + * @offset: file/stream offset + * @name: header name + * @value: header value + * + * A message/rfc822 header. + **/ + +struct _GMimeHeader { + GMimeHeader *next; + GMimeHeader *prev; + /*gint64 offset;*/ + char *name; + char *value; +}; + +struct _GMimeHeaderList { + GMimeStream *stream; + GHashTable *writers; + GMimeEvent *changed; + GHashTable *hash; + guint32 version; + List list; +}; + + +static GMimeHeader *g_mime_header_new (const char *name, const char *value, gint64 offset); +static void g_mime_header_free (GMimeHeader *header); + + +/** + * g_mime_header_new: + * @name: header name + * @value: header value + * @offset: file/stream offset for the start of the header (or %-1 if unknown) + * + * Creates a new #GMimeHeader. + * + * Returns: a new #GMimeHeader with the specified values. + **/ +static GMimeHeader * +g_mime_header_new (const char *name, const char *value, gint64 offset) +{ + GMimeHeader *header; + + header = g_slice_new (GMimeHeader); + header->name = g_strdup (name); + header->value = g_strdup (value); + /*header->offset = offset;*/ + header->next = NULL; + header->prev = NULL; + + return header; +} + + +/** + * g_mime_header_free: + * @header: a #GMimeHeader + * + * Frees a single #GMimeHeader node. + **/ +static void +g_mime_header_free (GMimeHeader *header) +{ + g_free (header->name); + g_free (header->value); + + g_slice_free (GMimeHeader, header); +} + + +/** + * g_mime_header_iter_new: + * + * Dynamically allocates a #GMimeHeaderIter on the heap. This is + * intended for use in language bindings but may also be useful in + * applications as well. You must free this iter with + * g_mime_header_iter_free(). + * + * Returns: a newly-allocated #GMimeHeaderIter. + **/ +GMimeHeaderIter * +g_mime_header_iter_new (void) +{ + GMimeHeaderIter *iter; + + iter = g_slice_new (GMimeHeaderIter); + iter->hdrlist = NULL; + iter->cursor = NULL; + iter->version = 0; + + return iter; +} + + +/** + * g_mime_header_iter_copy: + * @iter: a #GMimeHeaderIter + * + * Creates a dynamically allocated header iterator as a copy of + * @iter. You must free this iter with g_mime_header_iter_free(). + * + * Returns: a newly-allocated copy of @iter. + **/ +GMimeHeaderIter * +g_mime_header_iter_copy (GMimeHeaderIter *iter) +{ + GMimeHeaderIter *copy; + + g_return_val_if_fail (iter != NULL, NULL); + + copy = g_mime_header_iter_new (); + memcpy (copy, iter, sizeof (GMimeHeaderIter)); + + return copy; +} + + +/** + * g_mime_header_iter_copy_to: + * @src: a #GMimeHeaderIter + * @dest: a #GMimeHeaderIter + * + * Copies @src to @dest. + **/ +void +g_mime_header_iter_copy_to (GMimeHeaderIter *src, GMimeHeaderIter *dest) +{ + g_return_if_fail (dest != NULL); + g_return_if_fail (src != NULL); + + memcpy (dest, src, sizeof (GMimeHeaderIter)); +} + + +/** + * g_mime_header_iter_free: + * @iter: a #GMimeHeaderIter + * + * Frees a dynamically-allocated #GMimeHeaderIter as created by + * g_mime_header_iter_new() or g_mime_header_iter_copy(). + **/ +void +g_mime_header_iter_free (GMimeHeaderIter *iter) +{ + g_return_if_fail (iter != NULL); + + g_slice_free (GMimeHeaderIter, iter); +} + + +/** + * g_mime_header_iter_equal: + * @iter1: a #GMimeHeaderIter + * @iter2: a #GMimeHeaderIter + * + * Check that @iter1 and @iter2 reference the same header. + * + * Returns: %TRUE if @iter1 and @iter2 refer to the same header or + * %FALSE otherwise. + **/ +gboolean +g_mime_header_iter_equal (GMimeHeaderIter *iter1, GMimeHeaderIter *iter2) +{ + g_return_val_if_fail (iter1 != NULL, FALSE); + g_return_val_if_fail (iter2 != NULL, FALSE); + + return iter1->hdrlist == iter2->hdrlist && + iter1->version == iter2->version && + iter1->cursor == iter2->cursor; +} + + +/** + * g_mime_header_iter_is_valid: + * @iter: a #GMimeHeaderIter + * + * Checks if a #GMimeHeaderIter is valid. An iterator may become + * invalid if the #GMimeHeaderList that the iterator refers to + * changes. + * + * Returns: %TRUE if @iter is still valid or %FALSE otherwise. + **/ +gboolean +g_mime_header_iter_is_valid (GMimeHeaderIter *iter) +{ + g_return_val_if_fail (iter != NULL, FALSE); + + if (!iter->hdrlist || iter->version != iter->hdrlist->version) + return FALSE; + + if (!iter->cursor || !iter->cursor->next) + return FALSE; + + return TRUE; +} + + +/** + * g_mime_header_iter_first: + * @iter: a #GMimeHeaderIter + * + * Updates @iter to point to the first header. + * + * Returns: %TRUE on success or %FALSE otherwise. + **/ +gboolean +g_mime_header_iter_first (GMimeHeaderIter *iter) +{ + GMimeHeader *first; + + g_return_val_if_fail (iter != NULL, FALSE); + + /* make sure we can actually do as requested */ + if (!iter->hdrlist || list_is_empty (&iter->hdrlist->list)) + return FALSE; + + first = (GMimeHeader *) iter->hdrlist->list.head; + + iter->version = iter->hdrlist->version; + iter->cursor = first; + + return TRUE; +} + + +/** + * g_mime_header_iter_last: + * @iter: a #GMimeHeaderIter + * + * Updates @iter to point to the last header. + * + * Returns: %TRUE on success or %FALSE otherwise. + **/ +gboolean +g_mime_header_iter_last (GMimeHeaderIter *iter) +{ + GMimeHeader *last; + + g_return_val_if_fail (iter != NULL, FALSE); + + /* make sure we can actually do as requested */ + if (!iter->hdrlist || list_is_empty (&iter->hdrlist->list)) + return FALSE; + + last = (GMimeHeader *) iter->hdrlist->list.tailpred; + + iter->version = iter->hdrlist->version; + iter->cursor = last; + + return TRUE; +} + + +/** + * g_mime_header_iter_next: + * @iter: a #GMimeHeaderIter + * + * Advances to the next header. + * + * Returns: %TRUE on success or %FALSE otherwise. + **/ +gboolean +g_mime_header_iter_next (GMimeHeaderIter *iter) +{ + GMimeHeader *next; + + g_return_val_if_fail (iter != NULL, FALSE); + + /* make sure current cursor is valid */ + if (!g_mime_header_iter_is_valid (iter)) + return FALSE; + + /* make sure next item is valid */ + next = iter->cursor->next; + if (!next->next) + return FALSE; + + iter->cursor = next; + + return TRUE; +} + + +/** + * g_mime_header_iter_prev: + * @iter: a #GMimeHeaderIter + * + * Advances to the previous header. + * + * Returns: %TRUE on success or %FALSE otherwise. + **/ +gboolean +g_mime_header_iter_prev (GMimeHeaderIter *iter) +{ + GMimeHeader *prev; + + g_return_val_if_fail (iter != NULL, FALSE); + + /* make sure current cursor is valid */ + if (!g_mime_header_iter_is_valid (iter)) + return FALSE; + + /* make sure prev item is valid */ + prev = iter->cursor->prev; + if (!prev || !prev->prev) + return FALSE; + + iter->cursor = prev; + + return TRUE; +} + + +#if 0 +/** + * g_mime_header_iter_get_offset: + * @iter: a #GMimeHeaderIter + * + * Gets the current header's file/stream offset. + * + * Returns: the file/stream offset or %-1 if unknown or invalid. + **/ +gint64 +g_mime_header_iter_get_offset (GMimeHeaderIter *iter) +{ + g_return_val_if_fail (iter != NULL, -1); + + if (!g_mime_header_iter_is_valid (iter)) + return -1; + + return iter->cursor->offset; +} +#endif + + +/** + * g_mime_header_iter_get_name: + * @iter: a #GMimeHeaderIter + * + * Gets the current header's name. + * + * Returns: the header name or %NULL if invalid. + **/ +const char * +g_mime_header_iter_get_name (GMimeHeaderIter *iter) +{ + g_return_val_if_fail (iter != NULL, NULL); + + if (!g_mime_header_iter_is_valid (iter)) + return NULL; + + return iter->cursor->name; +} + + +/** + * g_mime_header_iter_set_value: + * @iter: a #GMimeHeaderIter + * @value: new header value + * + * Sets the current header's value to the new value. + * + * Returns: %TRUE if the value was set or %FALSE otherwise (indicates + * invalid iter). + **/ +gboolean +g_mime_header_iter_set_value (GMimeHeaderIter *iter, const char *value) +{ + g_return_val_if_fail (iter != NULL, FALSE); + + if (!g_mime_header_iter_is_valid (iter)) + return FALSE; + + g_free (iter->cursor->value); + iter->cursor->value = g_strdup (value); + + g_mime_header_list_set_stream (iter->hdrlist, NULL); + + return TRUE; +} + + +/** + * g_mime_header_iter_get_value: + * @iter: a #GMimeHeaderIter + * + * Gets the current header's name. + * + * Returns: the header name or %NULL if invalid. + **/ +const char * +g_mime_header_iter_get_value (GMimeHeaderIter *iter) +{ + g_return_val_if_fail (iter != NULL, NULL); + + if (!g_mime_header_iter_is_valid (iter)) + return NULL; + + return iter->cursor->value; +} + + +/** + * g_mime_header_iter_remove: + * @iter: a #GMimeHeaderIter + * + * Removes the current header and advances to the next header. + * + * Note: If you remove the last header in the list, then @iter will + * become invalid regardless of whether or not other headers remain. + * + * Returns: %TRUE on success or %FALSE otherwise. + **/ +gboolean +g_mime_header_iter_remove (GMimeHeaderIter *iter) +{ + GMimeHeader *cursor, *header, *next; + GMimeHeaderList *hdrlist; + + g_return_val_if_fail (iter != NULL, FALSE); + + if (!g_mime_header_iter_is_valid (iter)) + return FALSE; + + /* save iter state */ + hdrlist = iter->hdrlist; + cursor = iter->cursor; + next = cursor->next; + + if (!(header = g_hash_table_lookup (hdrlist->hash, cursor->name))) + return FALSE; + + if (cursor == header) { + /* update the header lookup table */ + GMimeHeader *node = next; + + g_hash_table_remove (hdrlist->hash, cursor->name); + + while (node->next) { + if (!g_ascii_strcasecmp (node->name, cursor->name)) { + /* enter this node into the lookup table */ + g_hash_table_insert (hdrlist->hash, node->name, node); + break; + } + + node = node->next; + } + } + + /* remove/free the header */ + list_unlink ((ListNode *) cursor); + g_mime_header_free (cursor); + hdrlist->version++; + + /* update iter state */ + iter->version = hdrlist->version; + iter->cursor = next; + + return TRUE; +} + + +/** + * g_mime_header_list_new: + * + * Creates a new #GMimeHeaderList object. + * + * Returns: a new header list object. + **/ +GMimeHeaderList * +g_mime_header_list_new (void) +{ + GMimeHeaderList *headers; + + headers = g_slice_new (GMimeHeaderList); + headers->writers = g_hash_table_new_full (g_mime_strcase_hash, + g_mime_strcase_equal, + g_free, NULL); + headers->hash = g_hash_table_new (g_mime_strcase_hash, + g_mime_strcase_equal); + list_init (&headers->list); + headers->changed = g_mime_event_new (headers); + headers->stream = NULL; + headers->version = 0; + + return headers; +} + + +/** + * g_mime_header_list_destroy: + * @headers: a #GMimeHeaderList + * + * Destroy the header list. + **/ +void +g_mime_header_list_destroy (GMimeHeaderList *headers) +{ + GMimeHeader *header, *next; + + if (!headers) + return; + + header = (GMimeHeader *) headers->list.head; + while (header->next) { + next = header->next; + g_mime_header_free (header); + header = next; + } + + g_hash_table_destroy (headers->writers); + g_hash_table_destroy (headers->hash); + + if (headers->stream) + g_object_unref (headers->stream); + + g_mime_event_destroy (headers->changed); + + g_slice_free (GMimeHeaderList, headers); +} + + +/** + * g_mime_header_list_clear: + * @headers: a #GMimeHeaderList + * + * Removes all of the headers from the #GMimeHeaderList. + **/ +void +g_mime_header_list_clear (GMimeHeaderList *headers) +{ + GMimeHeader *header, *next; + + g_return_if_fail (headers != NULL); + + header = (GMimeHeader *) headers->list.head; + while (header->next) { + next = header->next; + g_mime_header_free (header); + header = next; + } + + g_hash_table_remove_all (headers->hash); + list_init (&headers->list); + + g_mime_header_list_set_stream (headers, NULL); +} + + +/** + * g_mime_header_list_contains: + * @headers: a #GMimeHeaderList + * @name: header name + * + * Checks whether or not a header exists. + * + * Returns: %TRUE if the specified header exists or %FALSE otherwise. + **/ +gboolean +g_mime_header_list_contains (const GMimeHeaderList *headers, const char *name) +{ + const GMimeHeader *header; + + g_return_val_if_fail (headers != NULL, FALSE); + g_return_val_if_fail (name != NULL, FALSE); + + if (!(header = g_hash_table_lookup (headers->hash, name))) + return FALSE; + + return TRUE; +} + + +/** + * g_mime_header_list_prepend: + * @headers: a #GMimeHeaderList + * @name: header name + * @value: header value + * + * Prepends a header. If @value is %NULL, a space will be set aside + * for it (useful for setting the order of headers before values can + * be obtained for them) otherwise the header will be unset. + **/ +void +g_mime_header_list_prepend (GMimeHeaderList *headers, const char *name, const char *value) +{ + GMimeHeader *header; + + g_return_if_fail (headers != NULL); + g_return_if_fail (name != NULL); + + header = g_mime_header_new (name, value, -1); + list_prepend (&headers->list, (ListNode *) header); + g_hash_table_replace (headers->hash, header->name, header); + + g_mime_header_list_set_stream (headers, NULL); +} + + +/** + * g_mime_header_list_append: + * @headers: a #GMimeHeaderList + * @name: header name + * @value: header value + * + * Appends a header. If @value is %NULL, a space will be set aside for it + * (useful for setting the order of headers before values can be + * obtained for them) otherwise the header will be unset. + **/ +void +g_mime_header_list_append (GMimeHeaderList *headers, const char *name, const char *value) +{ + GMimeHeader *header; + + g_return_if_fail (headers != NULL); + g_return_if_fail (name != NULL); + + header = g_mime_header_new (name, value, -1); + list_append (&headers->list, (ListNode *) header); + + if (!g_hash_table_lookup (headers->hash, name)) + g_hash_table_insert (headers->hash, header->name, header); + + g_mime_header_list_set_stream (headers, NULL); +} + + +/** + * g_mime_header_list_get: + * @headers: a #GMimeHeaderList + * @name: header name + * + * Gets the value of the first header with the name requested. + * + * Returns: the value of the header requested. + **/ +const char * +g_mime_header_list_get (const GMimeHeaderList *headers, const char *name) +{ + const GMimeHeader *header; + + g_return_val_if_fail (headers != NULL, NULL); + g_return_val_if_fail (name != NULL, NULL); + + if (!(header = g_hash_table_lookup (headers->hash, name))) + return NULL; + + return header->value; +} + + +/** + * g_mime_header_list_set: + * @headers: a #GMimeHeaderList + * @name: header name + * @value: header value + * + * Set the value of the specified header. If @value is %NULL and the + * header, @name, had not been previously set, a space will be set + * aside for it (useful for setting the order of headers before values + * can be obtained for them) otherwise the header will be unset. + * + * Note: If there are multiple headers with the specified field name, + * the first instance of the header will be replaced and further + * instances will be removed. + **/ +void +g_mime_header_list_set (GMimeHeaderList *headers, const char *name, const char *value) +{ + GMimeHeader *header, *next; + + g_return_if_fail (headers != NULL); + g_return_if_fail (name != NULL); + + if ((header = g_hash_table_lookup (headers->hash, name))) { + g_free (header->value); + header->value = g_strdup (value); + + header = header->next; + while (header->next) { + next = header->next; + + if (!g_ascii_strcasecmp (header->name, name)) { + /* remove/free the header */ + list_unlink ((ListNode *) header); + g_mime_header_free (header); + headers->version++; + } + + header = next; + } + } else { + header = g_mime_header_new (name, value, -1); + list_append (&headers->list, (ListNode *) header); + g_hash_table_insert (headers->hash, header->name, header); + } + + g_mime_header_list_set_stream (headers, NULL); +} + + +/** + * g_mime_header_list_remove: + * @headers: a #GMimeHeaderList + * @name: header name + * + * Remove the specified header. + * + * Returns: %TRUE if the header was successfully removed or %FALSE if + * the specified header could not be found. + **/ +gboolean +g_mime_header_list_remove (GMimeHeaderList *headers, const char *name) +{ + GMimeHeader *header, *node; + + g_return_val_if_fail (headers != NULL, FALSE); + g_return_val_if_fail (name != NULL, FALSE); + + if (!(header = g_hash_table_lookup (headers->hash, name))) + return FALSE; + + /* look for another header with the same name... */ + node = header->next; + while (node->next) { + if (!g_ascii_strcasecmp (node->name, name)) { + /* enter this node into the lookup table */ + g_hash_table_replace (headers->hash, node->name, node); + break; + } + + node = node->next; + } + + /* invalidate all our outstanding iterators matching @header */ + headers->version++; + + /* remove/free the header */ + list_unlink ((ListNode *) header); + g_mime_header_free (header); + + g_mime_header_list_set_stream (headers, NULL); + + return TRUE; +} + + +/** + * g_mime_header_list_get_iter: + * @headers: a #GMimeHeaderList + * @iter: a #GMimeHeaderIter + * + * Initializes an iterator for traversing @headers. + * + * Returns: a %TRUE if successful or %FALSE if there are no headers to + * traverse. + **/ +gboolean +g_mime_header_list_get_iter (GMimeHeaderList *headers, GMimeHeaderIter *iter) +{ + GMimeHeader *cursor; + + g_return_val_if_fail (headers != NULL, FALSE); + + cursor = (GMimeHeader *) headers->list.head; + if (!cursor->next) + return FALSE; + + iter->version = headers->version; + iter->hdrlist = headers; + iter->cursor = cursor; + + return TRUE; +} + + +/** + * g_mime_header_list_foreach: + * @headers: A #GMimeHeaderList + * @func: function to be called for each header. + * @user_data: User data to be passed to the func. + * + * Calls @func for each header name/value pair. + */ +void +g_mime_header_list_foreach (const GMimeHeaderList *headers, GMimeHeaderForeachFunc func, gpointer user_data) +{ + const GMimeHeader *header; + + g_return_if_fail (headers != NULL); + g_return_if_fail (func != NULL); + + header = (const GMimeHeader *) headers->list.head; + + while (header->next) { + func (header->name, header->value, user_data); + header = header->next; + } +} + + +static ssize_t +default_writer (GMimeStream *stream, const char *name, const char *value) +{ + ssize_t nwritten; + char *val; + + val = g_mime_utils_header_printf ("%s: %s\n", name, value); + nwritten = g_mime_stream_write_string (stream, val); + g_free (val); + + return nwritten; +} + + +/** + * g_mime_header_list_write_to_stream: + * @headers: a #GMimeHeaderList + * @stream: output stream + * + * Write the headers to a stream. + * + * Returns: the number of bytes written or %-1 on fail. + **/ +ssize_t +g_mime_header_list_write_to_stream (const GMimeHeaderList *headers, GMimeStream *stream) +{ + ssize_t nwritten, total = 0; + GMimeHeaderWriter writer; + GHashTable *writers; + GMimeHeader *header; + + g_return_val_if_fail (headers != NULL, -1); + g_return_val_if_fail (stream != NULL, -1); + + if (headers->stream) { + g_mime_stream_reset (headers->stream); + return g_mime_stream_write_to_stream (headers->stream, stream); + } + + header = (GMimeHeader *) headers->list.head; + writers = headers->writers; + + while (header->next) { + if (header->value) { + if (!(writer = g_hash_table_lookup (writers, header->name))) + writer = default_writer; + + if ((nwritten = writer (stream, header->name, header->value)) == -1) + return -1; + + total += nwritten; + } + + header = header->next; + } + + return total; +} + + +/** + * g_mime_header_list_to_string: + * @headers: a #GMimeHeaderList + * + * Allocates a string buffer containing the raw rfc822 headers + * contained in @headers. + * + * Returns: a string containing the header block. + **/ +char * +g_mime_header_list_to_string (const GMimeHeaderList *headers) +{ + GMimeStream *stream; + GByteArray *array; + char *str; + + g_return_val_if_fail (headers != NULL, NULL); + + array = g_byte_array_new (); + stream = g_mime_stream_mem_new (); + g_mime_stream_mem_set_byte_array (GMIME_STREAM_MEM (stream), array); + + if (headers->stream) { + g_mime_stream_reset (headers->stream); + g_mime_stream_write_to_stream (headers->stream, stream); + } else { + g_mime_header_list_write_to_stream (headers, stream); + } + + g_object_unref (stream); + + g_byte_array_append (array, (unsigned char *) "", 1); + str = (char *) array->data; + g_byte_array_free (array, FALSE); + + return str; +} + + +/** + * g_mime_header_list_register_writer: + * @headers: a #GMimeHeaderList + * @name: header name + * @writer: writer function + * + * Changes the function used to write @name headers to @writer (or the + * default if @writer is %NULL). This is useful if you want to change + * the default header folding style for a particular header. + **/ +void +g_mime_header_list_register_writer (GMimeHeaderList *headers, const char *name, GMimeHeaderWriter writer) +{ + gpointer okey, oval; + + g_return_if_fail (headers != NULL); + g_return_if_fail (name != NULL); + + if (g_hash_table_lookup (headers->writers, name)) { + g_hash_table_lookup_extended (headers->writers, name, &okey, &oval); + g_hash_table_remove (headers->writers, name); + g_free (okey); + } + + if (writer) + g_hash_table_insert (headers->writers, g_strdup (name), writer); +} + + + +/** + * g_mime_header_list_set_stream: + * @headers: a #GMimeHeaderList + * @stream: a #GMimeStream + * + * Set the raw header stream. + **/ +void +g_mime_header_list_set_stream (GMimeHeaderList *headers, GMimeStream *stream) +{ + g_return_if_fail (stream == NULL || GMIME_IS_STREAM (stream)); + g_return_if_fail (headers != NULL); + + if (headers->stream == stream) + return; + + if (stream) + g_object_ref (stream); + + if (headers->stream) + g_object_unref (headers->stream); + + headers->stream = stream; + + g_mime_event_emit (headers->changed, NULL); +} + + +/** + * g_mime_header_list_get_stream: + * @headers: a #GMimeHeaderList + * + * Gets the raw stream representing @headers. + * + * Returns: a #GMimeStream if set or %NULL otherwise. + **/ +GMimeStream * +g_mime_header_list_get_stream (GMimeHeaderList *headers) +{ + g_return_val_if_fail (headers != NULL, NULL); + + return headers->stream; +} + + +GMimeEvent * +_g_mime_header_list_get_changed_event (GMimeHeaderList *headers) +{ + g_return_val_if_fail (headers != NULL, NULL); + + return headers->changed; +} diff --git a/gmime/gmime-header.h b/gmime/gmime-header.h new file mode 100644 index 0000000..53963d0 --- /dev/null +++ b/gmime/gmime-header.h @@ -0,0 +1,133 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_HEADER_H__ +#define __GMIME_HEADER_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _GMimeHeader GMimeHeader; + + +/** + * GMimeHeaderForeachFunc: + * @name: The field name. + * @value: The field value. + * @user_data: The user-supplied callback data. + * + * Function signature for the callback to g_mime_header_list_foreach(). + **/ +typedef void (* GMimeHeaderForeachFunc) (const char *name, const char *value, gpointer user_data); + + +/** + * GMimeHeaderList: + * + * A message or mime-part header. + **/ +typedef struct _GMimeHeaderList GMimeHeaderList; + + +/** + * GMimeHeaderIter: + * @hdrlist: a #GMimeHeaderList + * @cursor: a #GMimeHeader + * @version: the version of @hdrlist when initialized + * + * A message or mime-part header iterator. All members should be + * considered private. + **/ +typedef struct _GMimeHeaderIter GMimeHeaderIter; + +struct _GMimeHeaderIter { + GMimeHeaderList *hdrlist; + GMimeHeader *cursor; + guint32 version; +}; + + +GMimeHeaderIter *g_mime_header_iter_new (void); +void g_mime_header_iter_free (GMimeHeaderIter *iter); + +GMimeHeaderIter *g_mime_header_iter_copy (GMimeHeaderIter *iter); +void g_mime_header_iter_copy_to (GMimeHeaderIter *src, GMimeHeaderIter *dest); + +gboolean g_mime_header_iter_equal (GMimeHeaderIter *iter1, GMimeHeaderIter *iter2); + +gboolean g_mime_header_iter_is_valid (GMimeHeaderIter *iter); + +gboolean g_mime_header_iter_first (GMimeHeaderIter *iter); +gboolean g_mime_header_iter_last (GMimeHeaderIter *iter); + +gboolean g_mime_header_iter_next (GMimeHeaderIter *iter); +gboolean g_mime_header_iter_prev (GMimeHeaderIter *iter); + +/*gint64 g_mime_header_iter_get_offset (GMimeHeaderIter *iter);*/ +const char *g_mime_header_iter_get_name (GMimeHeaderIter *iter); +gboolean g_mime_header_iter_set_value (GMimeHeaderIter *iter, const char *value); +const char *g_mime_header_iter_get_value (GMimeHeaderIter *iter); + +gboolean g_mime_header_iter_remove (GMimeHeaderIter *iter); + + +/** + * GMimeHeaderWriter: + * @stream: The output stream. + * @name: The field name. + * @value: The field value. + * + * Function signature for the callback to + * g_mime_header_list_register_writer(). + * + * Returns: the number of bytes written or %-1 on error. + **/ +typedef ssize_t (* GMimeHeaderWriter) (GMimeStream *stream, const char *name, const char *value); + + +GMimeHeaderList *g_mime_header_list_new (void); + +void g_mime_header_list_destroy (GMimeHeaderList *headers); + +void g_mime_header_list_set_stream (GMimeHeaderList *headers, GMimeStream *stream); +GMimeStream *g_mime_header_list_get_stream (GMimeHeaderList *headers); + +void g_mime_header_list_clear (GMimeHeaderList *headers); +gboolean g_mime_header_list_contains (const GMimeHeaderList *headers, const char *name); +void g_mime_header_list_prepend (GMimeHeaderList *headers, const char *name, const char *value); +void g_mime_header_list_append (GMimeHeaderList *headers, const char *name, const char *value); +void g_mime_header_list_set (GMimeHeaderList *headers, const char *name, const char *value); +const char *g_mime_header_list_get (const GMimeHeaderList *headers, const char *name); +gboolean g_mime_header_list_remove (GMimeHeaderList *headers, const char *name); + +gboolean g_mime_header_list_get_iter (GMimeHeaderList *headers, GMimeHeaderIter *iter); + +void g_mime_header_list_foreach (const GMimeHeaderList *headers, GMimeHeaderForeachFunc func, gpointer user_data); + +void g_mime_header_list_register_writer (GMimeHeaderList *headers, const char *name, GMimeHeaderWriter writer); +ssize_t g_mime_header_list_write_to_stream (const GMimeHeaderList *headers, GMimeStream *stream); +char *g_mime_header_list_to_string (const GMimeHeaderList *headers); + +G_END_DECLS + +#endif /* __GMIME_HEADER_H__ */ diff --git a/gmime/gmime-iconv-utils.c b/gmime/gmime-iconv-utils.c new file mode 100644 index 0000000..f377849 --- /dev/null +++ b/gmime/gmime-iconv-utils.c @@ -0,0 +1,306 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gmime-iconv-utils.h" +#include "gmime-charset.h" + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + + +/** + * SECTION: gmime-iconv-utils + * @title: gmime-iconv-utils + * @short_description: High-level routines for converting text from one charset to another + * @see_also: + * + * Charset conversion utility functions. + **/ + + +#ifdef G_THREADS_ENABLED +static GStaticMutex lock = G_STATIC_MUTEX_INIT; +#define LOCK() g_static_mutex_lock (&lock) +#define UNLOCK() g_static_mutex_unlock (&lock) +#else +#define LOCK() +#define UNLOCK() +#endif /* G_THREADS_ENABLED */ + +static iconv_t utf8_to_locale = (iconv_t) -1; +static iconv_t locale_to_utf8 = (iconv_t) -1; + + +static void +iconv_utils_init (void) +{ + static gboolean initialized = FALSE; + const char *utf8, *locale; + + if (initialized) + return; + + g_mime_charset_map_init (); + + utf8 = g_mime_charset_iconv_name ("UTF-8"); + + if (!(locale = g_mime_locale_charset ())) + locale = "US-ASCII"; + + if ((locale = g_mime_charset_iconv_name (locale))) { + utf8_to_locale = iconv_open (locale, utf8); + locale_to_utf8 = iconv_open (utf8, locale); + } + + initialized = TRUE; +} + + +/** + * g_mime_iconv_strndup: + * @cd: conversion descriptor + * @str: string in source charset + * @n: number of bytes to convert + * + * Allocates a new string buffer containing the first @n bytes of @str + * converted to the destination charset as described by the conversion + * descriptor @cd. + * + * Returns: a new string buffer containing the first @n bytes of + * @str converted to the destination charset as described by the + * conversion descriptor @cd. + **/ +char * +g_mime_iconv_strndup (iconv_t cd, const char *str, size_t n) +{ + size_t inleft, outleft, converted = 0; + char *out, *outbuf; + const char *inbuf; + size_t outlen; + int errnosav; + + if (cd == (iconv_t) -1) + return g_strndup (str, n); + + outlen = n * 2 + 16; + out = g_malloc (outlen + 4); + + inbuf = str; + inleft = n; + + do { + errno = 0; + outbuf = out + converted; + outleft = outlen - converted; + + converted = iconv (cd, (char **) &inbuf, &inleft, &outbuf, &outleft); + if (converted != (size_t) -1 || errno == EINVAL) { + /* + * EINVAL An incomplete multibyte sequence has been encoun­ + * tered in the input. + * + * We'll just have to ignore it... + */ + break; + } + + if (errno != E2BIG) { + errnosav = errno; + + w(g_warning ("g_mime_iconv_strndup: %s at byte %lu", + strerror (errno), n - inleft)); + + g_free (out); + + /* reset the cd */ + iconv (cd, NULL, NULL, NULL, NULL); + + errno = errnosav; + + return NULL; + } + + /* + * E2BIG There is not sufficient room at *outbuf. + * + * We just need to grow our outbuffer and try again. + */ + + converted = outbuf - out; + outlen += inleft * 2 + 16; + out = g_realloc (out, outlen + 4); + outbuf = out + converted; + } while (TRUE); + + /* flush the iconv conversion */ + while (iconv (cd, NULL, NULL, &outbuf, &outleft) == (size_t) -1) { + if (errno != E2BIG) + break; + + outlen += 16; + converted = outbuf - out; + out = g_realloc (out, outlen + 4); + outleft = outlen - converted; + outbuf = out + converted; + } + + /* Note: not all charsets can be nul-terminated with a single + nul byte. UCS2, for example, needs 2 nul bytes and UCS4 + needs 4. I hope that 4 nul bytes is enough to terminate all + multibyte charsets? */ + + /* nul-terminate the string */ + memset (outbuf, 0, 4); + + /* reset the cd */ + iconv (cd, NULL, NULL, NULL, NULL); + + return out; +} + + +/** + * g_mime_iconv_strdup: + * @cd: conversion descriptor + * @str: string in source charset + * + * Allocates a new string buffer containing @str converted to the + * destination charset described in @cd. + * + * Returns: a new string buffer containing the original string + * converted to the new charset. + **/ +char * +g_mime_iconv_strdup (iconv_t cd, const char *str) +{ + return g_mime_iconv_strndup (cd, str, strlen (str)); +} + + +/** + * g_mime_iconv_locale_to_utf8: + * @str: string in locale charset + * + * Allocates a new string buffer containing @str in UTF-8. + * + * Returns: a new string buffer containing @str converted to UTF-8. + **/ +char * +g_mime_iconv_locale_to_utf8 (const char *str) +{ + char *buf; + + LOCK (); + iconv_utils_init (); + + buf = g_mime_iconv_strdup (locale_to_utf8, str); + UNLOCK (); + + return buf; +} + + +/** + * g_mime_iconv_locale_to_utf8_length: + * @str: string in locale charset + * @n: number of bytes to convert + * + * Allocates a new string buffer containing the first @n bytes of + * @str converted to UTF-8. + * + * Returns: a new string buffer containing the first @n bytes of + * @str converted to UTF-8. + **/ +char * +g_mime_iconv_locale_to_utf8_length (const char *str, size_t n) +{ + char *buf; + + LOCK (); + iconv_utils_init (); + + buf = g_mime_iconv_strndup (locale_to_utf8, str, n); + UNLOCK (); + + return buf; +} + + +/** + * g_mime_iconv_utf8_to_locale: + * @str: string in UTF-8 charset + * + * Allocates a new string buffer containing @str converted to the + * user's locale charset. + * + * Returns: a new string buffer containing @str converted to the + * user's locale charset. + **/ +char * +g_mime_iconv_utf8_to_locale (const char *str) +{ + char *buf; + + LOCK (); + iconv_utils_init (); + + buf = g_mime_iconv_strdup (utf8_to_locale, str); + UNLOCK (); + + return buf; +} + + +/** + * g_mime_iconv_utf8_to_locale_length: + * @str: string in UTF-8 charset + * @n: number of bytes to convert + * + * Allocates a new string buffer containing the first @n bytes of + * @str converted to the user's locale charset. + * + * Returns: a new string buffer containing the first @n bytes of + * @str converted to the user's locale charset. + **/ +char * +g_mime_iconv_utf8_to_locale_length (const char *str, size_t n) +{ + char *buf; + + LOCK (); + iconv_utils_init (); + + buf = g_mime_iconv_strndup (utf8_to_locale, str, n); + UNLOCK (); + + return buf; +} diff --git a/gmime/gmime-iconv-utils.h b/gmime/gmime-iconv-utils.h new file mode 100644 index 0000000..ce4c323 --- /dev/null +++ b/gmime/gmime-iconv-utils.h @@ -0,0 +1,43 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_ICONV_UTILS_H__ +#define __GMIME_ICONV_UTILS_H__ + +#include + +#include +#include + +G_BEGIN_DECLS + +char *g_mime_iconv_strdup (iconv_t cd, const char *str); +char *g_mime_iconv_strndup (iconv_t cd, const char *str, size_t n); + +char *g_mime_iconv_locale_to_utf8 (const char *str); +char *g_mime_iconv_locale_to_utf8_length (const char *str, size_t n); + +char *g_mime_iconv_utf8_to_locale (const char *str); +char *g_mime_iconv_utf8_to_locale_length (const char *str, size_t n); + +G_END_DECLS + +#endif /* __GMIME_ICONV_UTILS_H__ */ diff --git a/gmime/gmime-iconv.c b/gmime/gmime-iconv.c new file mode 100644 index 0000000..0965075 --- /dev/null +++ b/gmime/gmime-iconv.c @@ -0,0 +1,360 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include "gmime-charset.h" +#include "gmime-iconv.h" +#include "cache.h" + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + + +/** + * SECTION: gmime-iconv + * @title: gmime-iconv + * @short_description: Low-level routines for converting text from one charset to another + * @see_also: + * + * These functions are wrappers around the system iconv(3) + * routines. The purpose of these wrappers are two-fold: + * + * 1. Cache iconv_t descriptors for you in order to optimize + * opening/closing many descriptors frequently + * + * and + * + * 2. To use the appropriate system charset alias for the MIME charset + * names given as arguments. + **/ + + +#define ICONV_CACHE_SIZE (16) + +typedef struct { + CacheNode node; + guint32 refcount : 31; + guint32 used : 1; + iconv_t cd; +} IconvCacheNode; + + +static Cache *iconv_cache = NULL; +static GHashTable *iconv_open_hash = NULL; + +#ifdef GMIME_ICONV_DEBUG +static int cache_misses = 0; +static int shutdown = 0; +#define d(x) x +#else +#define d(x) +#endif /* GMIME_ICONV_DEBUG */ + +#ifdef G_THREADS_ENABLED +static GStaticMutex iconv_cache_lock = G_STATIC_MUTEX_INIT; +#define ICONV_CACHE_LOCK() g_static_mutex_lock (&iconv_cache_lock) +#define ICONV_CACHE_UNLOCK() g_static_mutex_unlock (&iconv_cache_lock) +#else +#define ICONV_CACHE_LOCK() +#define ICONV_CACHE_UNLOCK() +#endif /* G_THREADS_ENABLED */ + + +/* caller *must* hold the iconv_cache_lock to call any of the following functions */ + + +/** + * iconv_cache_node_new: + * @key: cache key + * @cd: iconv descriptor + * + * Creates a new cache node, inserts it into the cache and increments + * the cache size. + * + * Returns: a pointer to the newly allocated cache node. + **/ +static IconvCacheNode * +iconv_cache_node_new (const char *key, iconv_t cd) +{ + IconvCacheNode *node; + +#ifdef GMIME_ICONV_DEBUG + cache_misses++; +#endif + + node = (IconvCacheNode *) cache_node_insert (iconv_cache, key); + node->refcount = 1; + node->used = TRUE; + node->cd = cd; + + return node; +} + + +static void +iconv_cache_node_free (CacheNode *node) +{ + IconvCacheNode *inode = (IconvCacheNode *) node; + +#ifdef GMIME_ICONV_DEBUG + if (shutdown) { + fprintf (stderr, "%s: open=%d; used=%s\n", node->key, + inode->refcount, inode->used ? "yes" : "no"); + } +#endif + + iconv_close (inode->cd); +} + + +/** + * iconv_cache_node_expire: + * @node: cache node + * + * Decides whether or not a cache node should be expired. + **/ +static gboolean +iconv_cache_node_expire (Cache *cache, CacheNode *node) +{ + IconvCacheNode *inode = (IconvCacheNode *) node; + + if (inode->refcount == 0) + return TRUE; + + return FALSE; +} + + +static void +iconv_open_node_free (gpointer key, gpointer value, gpointer user_data) +{ + iconv_t cd = (iconv_t) key; + IconvCacheNode *node; + + node = (IconvCacheNode *) cache_node_lookup (iconv_cache, value, FALSE); + g_assert (node); + + if (cd != node->cd) { + node->refcount--; + iconv_close (cd); + } +} + + +/** + * g_mime_iconv_shutdown: + * + * Frees internal iconv caches created in g_mime_iconv_init(). + * + * Note: this function is called for you by g_mime_shutdown(). + **/ +void +g_mime_iconv_shutdown (void) +{ + if (!iconv_cache) + return; + +#ifdef GMIME_ICONV_DEBUG + fprintf (stderr, "There were %d iconv cache misses\n", cache_misses); + fprintf (stderr, "The following %d iconv cache buckets are still open:\n", iconv_cache->size); + shutdown = 1; +#endif + + g_hash_table_foreach (iconv_open_hash, iconv_open_node_free, NULL); + g_hash_table_destroy (iconv_open_hash); + iconv_open_hash = NULL; + + cache_free (iconv_cache); + iconv_cache = NULL; +} + + +/** + * g_mime_iconv_init: + * + * Initialize GMime's iconv cache. This *MUST* be called before any + * gmime-iconv interfaces will work correctly. + * + * Note: this function is called for you by g_mime_init(). + **/ +void +g_mime_iconv_init (void) +{ + if (iconv_cache) + return; + + g_mime_charset_map_init (); + + iconv_open_hash = g_hash_table_new (g_direct_hash, g_direct_equal); + iconv_cache = cache_new (iconv_cache_node_expire, iconv_cache_node_free, + sizeof (IconvCacheNode), ICONV_CACHE_SIZE); +} + + +/** + * g_mime_iconv_open: + * @to: charset to convert to + * @from: charset to convert from + * + * Allocates a coversion descriptor suitable for converting byte + * sequences from charset @from to charset @to. The resulting + * descriptor can be used with iconv() (or the g_mime_iconv() wrapper) any + * number of times until closed using g_mime_iconv_close(). + * + * See the manual page for iconv_open(3) for further details. + * + * Returns: a new conversion descriptor for use with g_mime_iconv() on + * success or (iconv_t) %-1 on fail as well as setting an appropriate + * errno value. + **/ +iconv_t +g_mime_iconv_open (const char *to, const char *from) +{ + IconvCacheNode *node; + iconv_t cd; + char *key; + + if (from == NULL || to == NULL) { + errno = EINVAL; + return (iconv_t) -1; + } + + if (!g_ascii_strcasecmp (from, "x-unknown")) + from = g_mime_locale_charset (); + + from = g_mime_charset_iconv_name (from); + to = g_mime_charset_iconv_name (to); + key = g_alloca (strlen (from) + strlen (to) + 2); + sprintf (key, "%s:%s", from, to); + + ICONV_CACHE_LOCK (); + + if ((node = (IconvCacheNode *) cache_node_lookup (iconv_cache, key, TRUE))) { + if (node->used) { + if ((cd = iconv_open (to, from)) == (iconv_t) -1) + goto exception; + } else { + /* Apparently iconv on Solaris <= 7 segfaults if you pass in + * NULL for anything but inbuf; work around that. (NULL outbuf + * or NULL *outbuf is allowed by Unix98.) + */ + size_t inleft = 0, outleft = 0; + char *outbuf = NULL; + + cd = node->cd; + node->used = TRUE; + + /* reset the descriptor */ + iconv (cd, NULL, &inleft, &outbuf, &outleft); + } + + node->refcount++; + } else { + if ((cd = iconv_open (to, from)) == (iconv_t) -1) + goto exception; + + node = iconv_cache_node_new (key, cd); + } + + g_hash_table_insert (iconv_open_hash, cd, ((CacheNode *) node)->key); + + ICONV_CACHE_UNLOCK (); + + return cd; + + exception: + + ICONV_CACHE_UNLOCK (); + +#if w(!)0 + if (errno == EINVAL) + g_warning ("Conversion from '%s' to '%s' is not supported", from, to); + else + g_warning ("Could not open converter from '%s' to '%s': %s", + from, to, strerror (errno)); +#endif + + return cd; +} + + +/** + * g_mime_iconv_close: + * @cd: iconv conversion descriptor + * + * Closes the iconv descriptor @cd. + * + * See the manual page for iconv_close(3) for further details. + * + * Returns: %0 on success or %-1 on fail as well as setting an + * appropriate errno value. + **/ +int +g_mime_iconv_close (iconv_t cd) +{ + IconvCacheNode *node; + const char *key; + + if (cd == (iconv_t) -1) + return 0; + + ICONV_CACHE_LOCK (); + + if ((key = g_hash_table_lookup (iconv_open_hash, cd))) { + g_hash_table_remove (iconv_open_hash, cd); + + node = (IconvCacheNode *) cache_node_lookup (iconv_cache, key, FALSE); + g_assert (node); + + if (iconv_cache->size > ICONV_CACHE_SIZE) { + /* expire before unreffing this node so that it wont get uncached */ + cache_expire_unused (iconv_cache); + } + + node->refcount--; + + if (cd == node->cd) + node->used = FALSE; + else + iconv_close (cd); + } else { + ICONV_CACHE_UNLOCK (); + + d(g_warning ("This iconv context wasn't opened using g_mime_iconv_open()")); + + return iconv_close (cd); + } + + ICONV_CACHE_UNLOCK (); + + return 0; +} diff --git a/gmime/gmime-iconv.h b/gmime/gmime-iconv.h new file mode 100644 index 0000000..0842351 --- /dev/null +++ b/gmime/gmime-iconv.h @@ -0,0 +1,105 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_ICONV_H__ +#define __GMIME_ICONV_H__ + +#include +#include + +G_BEGIN_DECLS + +void g_mime_iconv_init (void); +void g_mime_iconv_shutdown (void); + +iconv_t g_mime_iconv_open (const char *to, const char *from); + + +/** + * g_mime_iconv: + * @cd: iconv_t conversion descriptor + * @inbuf: input buffer + * @inleft: number of bytes left in @inbuf + * @outbuf: output buffer + * @outleft: number of bytes left in @outbuf + * + * The argument @cd must be a conversion descriptor created using the + * function #g_mime_iconv_open. + * + * The main case is when @inbuf is not %NULL and *inbuf is not + * %NULL. In this case, the #g_mime_iconv function converts the + * multibyte sequence starting at *inbuf to a multibyte sequence + * starting at *outbuf. At most *inleft bytes, starting at *inbuf, + * will be read. At most *outleft bytes, starting at *outbuf, will + * be written. + * + * The #g_mime_iconv function converts one multibyte character at a + * time, and for each character conversion it increments *inbuf and + * decrements *inleft by the number of converted input bytes, it + * increments *outbuf and decrements *outleft by the number of + * converted output bytes, and it updates the conversion state + * contained in @cd. The conversion can stop for four reasons: + * + * 1. An invalid multibyte sequence is encountered in the input. In + * this case it sets errno to %EILSEQ and returns (size_t)(-1). + * *inbuf is left pointing to the beginning of the invalid multibyte + * sequence. + * + * 2. The input byte sequence has been entirely converted, i.e. + * *inleft has gone down to %0. In this case #g_mime_iconv returns + * the number of non-reversible conversions performed during this + * call. + * + * 3. An incomplete multibyte sequence is encountered in the input, + * and the input byte sequence terminates after it. In this case it + * sets errno to %EINVAL and returns (size_t)(-1). *inbuf is left + * pointing to the beginning of the incomplete multibyte sequence. + * + * 4. The output buffer has no more room for the next converted + * character. In this case it sets errno to %E2BIG and returns + * (size_t)(-1). + * + * A different case is when @inbuf is %NULL or *inbuf is %NULL, but + * @outbuf is not %NULL and *outbuf is not %NULL. In this case, the + * #g_mime_iconv function attempts to set @cd's conversion state to + * the initial state and store a corresponding shift sequence at + * *outbuf. At most *outleft bytes, starting at *outbuf, will be + * written. If the output buffer has no more room for this reset + * sequence, it sets errno to %E2BIG and returns (size_t)(-1). + * Otherwise it increments *outbuf and decrements *outleft by the + * number of bytes written. + * + * A third case is when @inbuf is %NULL or *inbuf is %NULL, and + * @outbuf is %NULL or *outbuf is %NULL. In this case, the + * #g_mime_iconv function sets @cd's conversion state to the initial + * state. + * + * Returns: the number of characters converted in a nonreversible way + * during this call; reversible conversions are not counted. In case + * of error, it sets errno and returns (size_t)(-1). + **/ +#define g_mime_iconv(cd,inbuf,inleft,outbuf,outleft) iconv (cd, inbuf, inleft, outbuf, outleft) + +int g_mime_iconv_close (iconv_t cd); + +G_END_DECLS + +#endif /* __GMIME_ICONV_H__ */ diff --git a/gmime/gmime-message-part.c b/gmime/gmime-message-part.c new file mode 100644 index 0000000..4095120 --- /dev/null +++ b/gmime/gmime-message-part.c @@ -0,0 +1,227 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-message-part.h" + +#define d(x) + + +/** + * SECTION: gmime-message-part + * @title: GMimeMessagePart + * @short_description: Message parts + * @see_also: + * + * A #GMimeMessagePart represents message/rfc822 and message/news MIME + * parts. + **/ + + +/* GObject class methods */ +static void g_mime_message_part_class_init (GMimeMessagePartClass *klass); +static void g_mime_message_part_init (GMimeMessagePart *message_part, GMimeMessagePartClass *klass); +static void g_mime_message_part_finalize (GObject *object); + +/* GMimeObject class methods */ +static ssize_t message_part_write_to_stream (GMimeObject *object, GMimeStream *stream); + + +static GMimeObjectClass *parent_class = NULL; + + +GType +g_mime_message_part_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeMessagePartClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_message_part_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeMessagePart), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_message_part_init, + }; + + type = g_type_register_static (GMIME_TYPE_OBJECT, "GMimeMessagePart", &info, 0); + } + + return type; +} + + +static void +g_mime_message_part_class_init (GMimeMessagePartClass *klass) +{ + GMimeObjectClass *object_class = GMIME_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_OBJECT); + + gobject_class->finalize = g_mime_message_part_finalize; + + object_class->write_to_stream = message_part_write_to_stream; +} + +static void +g_mime_message_part_init (GMimeMessagePart *part, GMimeMessagePartClass *klass) +{ + part->message = NULL; +} + +static void +g_mime_message_part_finalize (GObject *object) +{ + GMimeMessagePart *part = (GMimeMessagePart *) object; + + if (part->message) + g_object_unref (part->message); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static ssize_t +message_part_write_to_stream (GMimeObject *object, GMimeStream *stream) +{ + GMimeMessagePart *part = (GMimeMessagePart *) object; + ssize_t nwritten, total = 0; + + /* write the content headers */ + if ((nwritten = g_mime_header_list_write_to_stream (object->headers, stream)) == -1) + return -1; + + total += nwritten; + + /* terminate the headers */ + if ((nwritten = g_mime_stream_write (stream, "\n", 1)) == -1) + return -1; + + total += nwritten; + + /* write the message */ + if (part->message) { + if ((nwritten = g_mime_object_write_to_stream (GMIME_OBJECT (part->message), stream)) == -1) + return -1; + + total += nwritten; + } + + return total; +} + + +/** + * g_mime_message_part_new: + * @subtype: message subtype or %NULL for "rfc822" + * + * Creates a new MIME message part object with a default content-type + * of message/@subtype. + * + * Returns: an empty MIME message part object with a default + * content-type of message/@subtype. + **/ +GMimeMessagePart * +g_mime_message_part_new (const char *subtype) +{ + GMimeContentType *content_type; + GMimeMessagePart *part; + + part = g_object_newv (GMIME_TYPE_MESSAGE_PART, 0, NULL); + + content_type = g_mime_content_type_new ("message", subtype ? subtype : "rfc822"); + g_mime_object_set_content_type (GMIME_OBJECT (part), content_type); + g_object_unref (content_type); + + return part; +} + + +/** + * g_mime_message_part_new_with_message: + * @subtype: message subtype or %NULL for "rfc822" + * @message: message + * + * Creates a new MIME message part object with a default content-type + * of message/@subtype containing @message. + * + * Returns: a MIME message part object with a default content-type of + * message/@subtype containing @message. + **/ +GMimeMessagePart * +g_mime_message_part_new_with_message (const char *subtype, GMimeMessage *message) +{ + GMimeMessagePart *part; + + part = g_mime_message_part_new (subtype); + part->message = message; + g_object_ref (message); + + return part; +} + + +/** + * g_mime_message_part_set_message: + * @part: message part + * @message: message + * + * Sets the @message object on the message part object @part. + **/ +void +g_mime_message_part_set_message (GMimeMessagePart *part, GMimeMessage *message) +{ + g_return_if_fail (GMIME_IS_MESSAGE_PART (part)); + + if (message) + g_object_ref (message); + + if (part->message) + g_object_unref (part->message); + + part->message = message; +} + + +/** + * g_mime_message_part_get_message: + * @part: message part + * + * Gets the message object on the message part object @part. + * + * Returns: the message part contained within @part. + **/ +GMimeMessage * +g_mime_message_part_get_message (GMimeMessagePart *part) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE_PART (part), NULL); + + return part->message; +} diff --git a/gmime/gmime-message-part.h b/gmime/gmime-message-part.h new file mode 100644 index 0000000..b40c5c4 --- /dev/null +++ b/gmime/gmime-message-part.h @@ -0,0 +1,71 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_MESSAGE_PART_H__ +#define __GMIME_MESSAGE_PART_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_MESSAGE_PART (g_mime_message_part_get_type ()) +#define GMIME_MESSAGE_PART(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_MESSAGE_PART, GMimeMessagePart)) +#define GMIME_MESSAGE_PART_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_MESSAGE_PART, GMimeMessagePartClass)) +#define GMIME_IS_MESSAGE_PART(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_MESSAGE_PART)) +#define GMIME_IS_MESSAGE_PART_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_MESSAGE_PART)) +#define GMIME_MESSAGE_PART_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_MESSAGE_PART, GMimeMessagePartClass)) + +typedef struct _GMimeMessagePart GMimeMessagePart; +typedef struct _GMimeMessagePartClass GMimeMessagePartClass; + +/** + * GMimeMessagePart: + * @parent_object: parent #GMimeObject + * @message: child #GMimeMessage + * + * A message/rfc822 or message/news MIME part. + **/ +struct _GMimeMessagePart { + GMimeObject parent_object; + + GMimeMessage *message; +}; + +struct _GMimeMessagePartClass { + GMimeObjectClass parent_class; + +}; + + +GType g_mime_message_part_get_type (void); + +GMimeMessagePart *g_mime_message_part_new (const char *subtype); + +GMimeMessagePart *g_mime_message_part_new_with_message (const char *subtype, GMimeMessage *message); + +void g_mime_message_part_set_message (GMimeMessagePart *part, GMimeMessage *message); + +GMimeMessage *g_mime_message_part_get_message (GMimeMessagePart *part); + +G_END_DECLS + +#endif /* __GMIME_MESSAGE_PART_H__ */ diff --git a/gmime/gmime-message-partial.c b/gmime/gmime-message-partial.c new file mode 100644 index 0000000..bfdef13 --- /dev/null +++ b/gmime/gmime-message-partial.c @@ -0,0 +1,495 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gmime-message-partial.h" +#include "gmime-stream-cat.h" +#include "gmime-stream-mem.h" +#include "gmime-parser.h" + + +/** + * SECTION: gmime-message-partial + * @title: GMimeMessagePartial + * @short_description: Partial MIME parts + * @se_also: + * + * A #GMimeMessagePartial represents the message/partial MIME part. + **/ + + +/* GObject class methods */ +static void g_mime_message_partial_class_init (GMimeMessagePartialClass *klass); +static void g_mime_message_partial_init (GMimeMessagePartial *catpart, GMimeMessagePartialClass *klass); +static void g_mime_message_partial_finalize (GObject *object); + +/* GMimeObject class methods */ +static void message_partial_prepend_header (GMimeObject *object, const char *header, const char *value); +static void message_partial_append_header (GMimeObject *object, const char *header, const char *value); +static void message_partial_set_header (GMimeObject *object, const char *header, const char *value); +static const char *message_partial_get_header (GMimeObject *object, const char *header); +static gboolean message_partial_remove_header (GMimeObject *object, const char *header); +static void message_partial_set_content_type (GMimeObject *object, GMimeContentType *content_type); + + +static GMimePartClass *parent_class = NULL; + + +GType +g_mime_message_partial_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeMessagePartialClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_message_partial_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeMessagePartial), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_message_partial_init, + }; + + type = g_type_register_static (GMIME_TYPE_PART, "GMimeMessagePartial", &info, 0); + } + + return type; +} + + +static void +g_mime_message_partial_class_init (GMimeMessagePartialClass *klass) +{ + GMimeObjectClass *object_class = GMIME_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_PART); + + gobject_class->finalize = g_mime_message_partial_finalize; + + object_class->prepend_header = message_partial_prepend_header; + object_class->append_header = message_partial_append_header; + object_class->remove_header = message_partial_remove_header; + object_class->set_header = message_partial_set_header; + object_class->get_header = message_partial_get_header; + object_class->set_content_type = message_partial_set_content_type; +} + +static void +g_mime_message_partial_init (GMimeMessagePartial *partial, GMimeMessagePartialClass *klass) +{ + partial->id = NULL; + partial->number = -1; + partial->total = -1; +} + +static void +g_mime_message_partial_finalize (GObject *object) +{ + GMimeMessagePartial *partial = (GMimeMessagePartial *) object; + + g_free (partial->id); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +message_partial_prepend_header (GMimeObject *object, const char *header, const char *value) +{ + /* RFC 1864 states that you cannot set a Content-MD5 on a message part */ + if (!g_ascii_strcasecmp ("Content-MD5", header)) + return; + + GMIME_OBJECT_CLASS (parent_class)->prepend_header (object, header, value); +} + +static void +message_partial_append_header (GMimeObject *object, const char *header, const char *value) +{ + /* RFC 1864 states that you cannot set a Content-MD5 on a message part */ + if (!g_ascii_strcasecmp ("Content-MD5", header)) + return; + + GMIME_OBJECT_CLASS (parent_class)->append_header (object, header, value); +} + +static void +message_partial_set_header (GMimeObject *object, const char *header, const char *value) +{ + /* RFC 1864 states that you cannot set a Content-MD5 on a message part */ + if (!g_ascii_strcasecmp ("Content-MD5", header)) + return; + + GMIME_OBJECT_CLASS (parent_class)->set_header (object, header, value); +} + +static const char * +message_partial_get_header (GMimeObject *object, const char *header) +{ + return GMIME_OBJECT_CLASS (parent_class)->get_header (object, header); +} + +static gboolean +message_partial_remove_header (GMimeObject *object, const char *header) +{ + return GMIME_OBJECT_CLASS (parent_class)->remove_header (object, header); +} + +static void +message_partial_set_content_type (GMimeObject *object, GMimeContentType *content_type) +{ + GMimeMessagePartial *partial = (GMimeMessagePartial *) object; + const char *value; + + value = g_mime_content_type_get_parameter (content_type, "id"); + g_free (partial->id); + partial->id = g_strdup (value); + + value = g_mime_content_type_get_parameter (content_type, "number"); + partial->number = value ? strtol (value, NULL, 10) : -1; + + value = g_mime_content_type_get_parameter (content_type, "total"); + partial->total = value ? strtol (value, NULL, 10) : -1; + + GMIME_OBJECT_CLASS (parent_class)->set_content_type (object, content_type); +} + + +/** + * g_mime_message_partial_new: + * @id: message/partial part id + * @number: message/partial part number + * @total: total number of message/partial parts + * + * Creates a new MIME message/partial object. + * + * Returns: an empty MIME message/partial object. + **/ +GMimeMessagePartial * +g_mime_message_partial_new (const char *id, int number, int total) +{ + GMimeContentType *content_type; + GMimeMessagePartial *partial; + char *num; + + partial = g_object_newv (GMIME_TYPE_MESSAGE_PARTIAL, 0, NULL); + + content_type = g_mime_content_type_new ("message", "partial"); + + partial->id = g_strdup (id); + g_mime_content_type_set_parameter (content_type, "id", id); + + partial->number = number; + num = g_strdup_printf ("%d", number); + g_mime_content_type_set_parameter (content_type, "number", num); + g_free (num); + + partial->total = total; + num = g_strdup_printf ("%d", total); + g_mime_content_type_set_parameter (content_type, "total", num); + g_free (num); + + g_mime_object_set_content_type (GMIME_OBJECT (partial), content_type); + g_object_unref (content_type); + + return partial; +} + + +/** + * g_mime_message_partial_get_id: + * @partial: message/partial object + * + * Gets the message/partial id parameter value. + * + * Returns: the message/partial id or %NULL on fail. + **/ +const char * +g_mime_message_partial_get_id (GMimeMessagePartial *partial) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE_PARTIAL (partial), NULL); + + return partial->id; +} + + +/** + * g_mime_message_partial_get_number: + * @partial: message/partial object + * + * Gets the message/partial part number. + * + * Returns: the message/partial part number or %-1 on fail. + **/ +int +g_mime_message_partial_get_number (GMimeMessagePartial *partial) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE_PARTIAL (partial), -1); + + return partial->number; +} + + +/** + * g_mime_message_partial_get_total: + * @partial: message/partial object + * + * Gets the total number of message/partial parts needed to + * reconstruct the original message. + * + * Returns: the total number of message/partial parts needed to + * reconstruct the original message or -1 on fail. + **/ +int +g_mime_message_partial_get_total (GMimeMessagePartial *partial) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE_PARTIAL (partial), -1); + + return partial->total; +} + + +static int +partial_compare (const void *v1, const void *v2) +{ + GMimeMessagePartial **partial1 = (GMimeMessagePartial **) v1; + GMimeMessagePartial **partial2 = (GMimeMessagePartial **) v2; + int num1, num2; + + num1 = g_mime_message_partial_get_number (*partial1); + num2 = g_mime_message_partial_get_number (*partial2); + + return num1 - num2; +} + + +/** + * g_mime_message_partial_reconstruct_message: + * @partials: an array of message/partial mime parts + * @num: the number of elements in @partials + * + * Reconstructs the GMimeMessage from the given message/partial parts + * in @partials. + * + * Returns: a GMimeMessage object on success or %NULL on fail. + **/ +GMimeMessage * +g_mime_message_partial_reconstruct_message (GMimeMessagePartial **partials, size_t num) +{ + GMimeMessagePartial *partial; + GMimeDataWrapper *wrapper; + GMimeStream *cat, *stream; + GMimeMessage *message; + GMimeParser *parser; + int total, number; + const char *id; + size_t i; + + if (num == 0 || !(id = g_mime_message_partial_get_id (partials[0]))) + return NULL; + + /* get them into the correct order... */ + qsort ((void *) partials, num, sizeof (gpointer), partial_compare); + + /* only the last message/partial part is REQUIRED to have the total parameter */ + if ((total = g_mime_message_partial_get_total (partials[num - 1])) == -1) + return NULL; + + if (num != (size_t) total) + return NULL; + + cat = g_mime_stream_cat_new (); + + for (i = 0; i < num; i++) { + const char *partial_id; + + partial = partials[i]; + + /* sanity check to make sure this part belongs... */ + partial_id = g_mime_message_partial_get_id (partial); + if (!partial_id || strcmp (id, partial_id)) + goto exception; + + /* sanity check to make sure we aren't missing any parts */ + if ((number = g_mime_message_partial_get_number (partial)) == -1) + goto exception; + + if ((size_t) number != i + 1) + goto exception; + + wrapper = g_mime_part_get_content_object (GMIME_PART (partial)); + stream = g_mime_data_wrapper_get_stream (wrapper); + + g_mime_stream_reset (stream); + g_mime_stream_cat_add_source (GMIME_STREAM_CAT (cat), stream); + } + + parser = g_mime_parser_new (); + g_mime_parser_init_with_stream (parser, cat); + g_object_unref (cat); + + message = g_mime_parser_construct_message (parser); + g_object_unref (parser); + + return message; + + exception: + + g_object_unref (cat); + + return NULL; +} + + +static GMimeMessage * +message_partial_message_new (GMimeMessage *base) +{ + const char *name, *value; + GMimeMessage *message; + GMimeHeaderList *list; + GMimeHeaderIter iter; + + message = g_mime_message_new (FALSE); + + list = ((GMimeObject *) base)->headers; + + if (g_mime_header_list_get_iter (list, &iter)) { + do { + name = g_mime_header_iter_get_name (&iter); + value = g_mime_header_iter_get_value (&iter); + g_mime_object_append_header ((GMimeObject *) message, name, value); + } while (g_mime_header_iter_next (&iter)); + } + + return message; +} + + +/** + * g_mime_message_partial_split_message: + * @message: message object + * @max_size: max size + * @nparts: number of parts + * + * Splits @message into an array of #GMimeMessage objects each + * containing a single #GMimeMessagePartial object containing + * @max_size bytes or fewer. @nparts is set to the number of + * #GMimeMessagePartial objects created. + * + * Returns: an array of #GMimeMessage objects and sets @nparts to th + * number of messages returned or %NULL on fail. + **/ +GMimeMessage ** +g_mime_message_partial_split_message (GMimeMessage *message, size_t max_size, size_t *nparts) +{ + GMimeMessage **messages; + GMimeMessagePartial *partial; + GMimeStream *stream, *substream; + GMimeDataWrapper *wrapper; + const unsigned char *buf; + GPtrArray *parts; + gint64 len, end; + const char *id; + gint64 start; + guint i; + + *nparts = 0; + + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + + stream = g_mime_stream_mem_new (); + if (g_mime_object_write_to_stream (GMIME_OBJECT (message), stream) == -1) { + g_object_unref (stream); + return NULL; + } + + g_mime_stream_reset (stream); + + len = g_mime_stream_length (stream); + + /* optimization */ + if (len <= max_size) { + g_object_unref (stream); + g_object_ref (message); + + messages = g_malloc (sizeof (void *)); + messages[0] = message; + *nparts = 1; + + return messages; + } + + start = 0; + parts = g_ptr_array_new (); + buf = ((GMimeStreamMem *) stream)->buffer->data; + + while (start < len) { + /* Preferably, we'd split on whole-lines if we can, + * but if that's not possible, split on max size */ + if ((end = MIN (len, start + max_size)) < len) { + register gint64 ebx; /* end boundary */ + + ebx = end; + while (ebx > (start + 1) && ebx[buf] != '\n') + ebx--; + + if (ebx[buf] == '\n') + end = ebx + 1; + } + + substream = g_mime_stream_substream (stream, start, end); + g_ptr_array_add (parts, substream); + start = end; + } + + id = g_mime_message_get_message_id (message); + + for (i = 0; i < parts->len; i++) { + partial = g_mime_message_partial_new (id, i + 1, parts->len); + wrapper = g_mime_data_wrapper_new_with_stream (GMIME_STREAM (parts->pdata[i]), + GMIME_CONTENT_ENCODING_DEFAULT); + g_object_unref (parts->pdata[i]); + g_mime_part_set_content_object (GMIME_PART (partial), wrapper); + g_object_unref (wrapper); + + parts->pdata[i] = message_partial_message_new (message); + g_mime_message_set_mime_part (GMIME_MESSAGE (parts->pdata[i]), GMIME_OBJECT (partial)); + g_object_unref (partial); + } + + g_object_unref (stream); + + messages = (GMimeMessage **) parts->pdata; + *nparts = parts->len; + + g_ptr_array_free (parts, FALSE); + + return messages; +} diff --git a/gmime/gmime-message-partial.h b/gmime/gmime-message-partial.h new file mode 100644 index 0000000..c0d5032 --- /dev/null +++ b/gmime/gmime-message-partial.h @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_MESSAGE_PARTIAL_H__ +#define __GMIME_MESSAGE_PARTIAL_H__ + +#include + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_MESSAGE_PARTIAL (g_mime_message_partial_get_type ()) +#define GMIME_MESSAGE_PARTIAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_MESSAGE_PARTIAL, GMimeMessagePartial)) +#define GMIME_MESSAGE_PARTIAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_MESSAGE_PARTIAL, GMimeMessagePartialClass)) +#define GMIME_IS_MESSAGE_PARTIAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_MESSAGE_PARTIAL)) +#define GMIME_IS_MESSAGE_PARTIAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_MESSAGE_PARTIAL)) +#define GMIME_MESSAGE_PARTIAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_MESSAGE_PARTIAL, GMimeMessagePartialClass)) + +typedef struct _GMimeMessagePartial GMimeMessagePartial; +typedef struct _GMimeMessagePartialClass GMimeMessagePartialClass; + +/** + * GMimeMessagePartial: + * @parent_object: parent #GMimePart object + * @number: the part number + * @total: the total number of message/partials that make up the whole message/rfc822 + * @id: message/partial id + * + * A message/partial MIME part. + **/ +struct _GMimeMessagePartial { + GMimePart parent_object; + + int number; + int total; + char *id; +}; + +struct _GMimeMessagePartialClass { + GMimePartClass parent_class; + +}; + + +GType g_mime_message_partial_get_type (void); + +GMimeMessagePartial *g_mime_message_partial_new (const char *id, int number, int total); + +const char *g_mime_message_partial_get_id (GMimeMessagePartial *partial); + +int g_mime_message_partial_get_number (GMimeMessagePartial *partial); + +int g_mime_message_partial_get_total (GMimeMessagePartial *partial); + +GMimeMessage *g_mime_message_partial_reconstruct_message (GMimeMessagePartial **partials, size_t num); + +GMimeMessage **g_mime_message_partial_split_message (GMimeMessage *message, size_t max_size, size_t *nparts); + +G_END_DECLS + +#endif /* __GMIME_MESSAGE_PARTIAL_H__ */ diff --git a/gmime/gmime-message.c b/gmime/gmime-message.c new file mode 100644 index 0000000..eae671e --- /dev/null +++ b/gmime/gmime-message.c @@ -0,0 +1,1622 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gmime-message.h" +#include "gmime-multipart.h" +#include "gmime-multipart-signed.h" +#include "gmime-multipart-encrypted.h" +#include "gmime-part.h" +#include "gmime-utils.h" +#include "gmime-common.h" +#include "gmime-stream-mem.h" +#include "gmime-table-private.h" +#include "gmime-parse-utils.h" +#include "gmime-events.h" + + +/** + * SECTION: gmime-message + * @title: GMimeMessage + * @short_description: Messages + * @see_also: + * + * A #GMimeMessage represents an rfc822 message. + **/ + +extern GMimeEvent *_g_mime_header_list_get_changed_event (GMimeHeaderList *headers); + +static void g_mime_message_class_init (GMimeMessageClass *klass); +static void g_mime_message_init (GMimeMessage *message, GMimeMessageClass *klass); +static void g_mime_message_finalize (GObject *object); + +/* GMimeObject class methods */ +static void message_prepend_header (GMimeObject *object, const char *header, const char *value); +static void message_append_header (GMimeObject *object, const char *header, const char *value); +static void message_set_header (GMimeObject *object, const char *header, const char *value); +static const char *message_get_header (GMimeObject *object, const char *header); +static gboolean message_remove_header (GMimeObject *object, const char *header); +static char *message_get_headers (GMimeObject *object); +static ssize_t message_write_to_stream (GMimeObject *object, GMimeStream *stream); +static void message_encode (GMimeObject *object, GMimeEncodingConstraint constraint); + +static ssize_t write_structured (GMimeStream *stream, const char *name, const char *value); +static ssize_t write_addrspec (GMimeStream *stream, const char *name, const char *value); +static ssize_t write_received (GMimeStream *stream, const char *name, const char *value); +static ssize_t write_subject (GMimeStream *stream, const char *name, const char *value); +static ssize_t write_msgid (GMimeStream *stream, const char *name, const char *value); + +static void to_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message); +static void cc_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message); +static void bcc_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message); + + +static GMimeObjectClass *parent_class = NULL; + + +static struct { + const char *name; + GMimeEventCallback changed_cb; +} recipient_types[] = { + { "To", (GMimeEventCallback) to_list_changed }, + { "Cc", (GMimeEventCallback) cc_list_changed }, + { "Bcc", (GMimeEventCallback) bcc_list_changed } +}; + +#define N_RECIPIENT_TYPES G_N_ELEMENTS (recipient_types) + +static char *rfc822_headers[] = { + "Return-Path", + "Received", + "Date", + "From", + "Reply-To", + "Subject", + "Sender", + "To", + "Cc", +}; + + +GType +g_mime_message_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeMessageClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_message_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeMessage), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_message_init, + }; + + type = g_type_register_static (GMIME_TYPE_OBJECT, "GMimeMessage", &info, 0); + } + + return type; +} + + +static void +g_mime_message_class_init (GMimeMessageClass *klass) +{ + GMimeObjectClass *object_class = GMIME_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_OBJECT); + + gobject_class->finalize = g_mime_message_finalize; + + object_class->prepend_header = message_prepend_header; + object_class->append_header = message_append_header; + object_class->remove_header = message_remove_header; + object_class->set_header = message_set_header; + object_class->get_header = message_get_header; + object_class->get_headers = message_get_headers; + object_class->write_to_stream = message_write_to_stream; + object_class->encode = message_encode; +} + +static void +mime_part_headers_changed (GMimeHeaderList *headers, gpointer args, GMimeMessage *message) +{ + /* clear the message's header stream */ + g_mime_header_list_set_stream (((GMimeObject *) message)->headers, NULL); +} + +static void +connect_changed_event (GMimeMessage *message, GMimeRecipientType type) +{ + InternetAddressList *list; + + list = message->recipients[type]; + + g_mime_event_add (list->priv, recipient_types[type].changed_cb, message); +} + +static void +disconnect_changed_event (GMimeMessage *message, GMimeRecipientType type) +{ + InternetAddressList *list; + + list = message->recipients[type]; + + g_mime_event_remove (list->priv, recipient_types[type].changed_cb, message); +} + +static void +block_changed_event (GMimeMessage *message, GMimeRecipientType type) +{ + InternetAddressList *list; + + list = message->recipients[type]; + + g_mime_event_block (list->priv, recipient_types[type].changed_cb, message); +} + +static void +unblock_changed_event (GMimeMessage *message, GMimeRecipientType type) +{ + InternetAddressList *list; + + list = message->recipients[type]; + + g_mime_event_unblock (list->priv, recipient_types[type].changed_cb, message); +} + +static void +g_mime_message_init (GMimeMessage *message, GMimeMessageClass *klass) +{ + GMimeHeaderList *headers = ((GMimeObject *) message)->headers; + guint i; + + message->from = NULL; + message->reply_to = NULL; + message->recipients = g_new (InternetAddressList *, N_RECIPIENT_TYPES); + message->subject = NULL; + message->date = 0; + message->tz_offset = 0; + message->message_id = NULL; + message->mime_part = NULL; + + /* initialize recipient lists */ + for (i = 0; i < N_RECIPIENT_TYPES; i++) { + message->recipients[i] = internet_address_list_new (); + connect_changed_event (message, i); + } + + g_mime_header_list_register_writer (headers, "Sender", write_addrspec); + g_mime_header_list_register_writer (headers, "From", write_addrspec); + g_mime_header_list_register_writer (headers, "To", write_addrspec); + g_mime_header_list_register_writer (headers, "Cc", write_addrspec); + g_mime_header_list_register_writer (headers, "Bcc", write_addrspec); + + g_mime_header_list_register_writer (headers, "Resent-Sender", write_addrspec); + g_mime_header_list_register_writer (headers, "Resent-From", write_addrspec); + g_mime_header_list_register_writer (headers, "Resent-To", write_addrspec); + g_mime_header_list_register_writer (headers, "Resent-Cc", write_addrspec); + g_mime_header_list_register_writer (headers, "Resent-Bcc", write_addrspec); + + g_mime_header_list_register_writer (headers, "Subject", write_subject); + g_mime_header_list_register_writer (headers, "Received", write_received); + g_mime_header_list_register_writer (headers, "Message-Id", write_msgid); + g_mime_header_list_register_writer (headers, "References", write_structured); +} + +static void +g_mime_message_finalize (GObject *object) +{ + GMimeMessage *message = (GMimeMessage *) object; + GMimeEvent *changed; + guint i; + + g_free (message->from); + g_free (message->reply_to); + + /* disconnect changed handlers */ + for (i = 0; i < N_RECIPIENT_TYPES; i++) { + disconnect_changed_event (message, i); + g_object_unref (message->recipients[i]); + } + + g_free (message->recipients); + + g_free (message->subject); + + g_free (message->message_id); + + /* unref child mime part */ + if (message->mime_part) { + changed = _g_mime_header_list_get_changed_event (message->mime_part->headers); + g_mime_event_remove (changed, (GMimeEventCallback) mime_part_headers_changed, message); + g_object_unref (message->mime_part); + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +typedef void (* token_skip_t) (const char **in); + +struct _received_token { + char *token; + size_t len; + token_skip_t skip; +}; + +static void skip_atom (const char **in); +static void skip_domain (const char **in); +static void skip_addr (const char **in); +static void skip_msgid (const char **in); + +static struct _received_token received_tokens[] = { + { "from ", 5, skip_domain }, + { "by ", 3, skip_domain }, + { "via ", 4, skip_atom }, + { "with ", 5, skip_atom }, + { "id ", 3, skip_msgid }, + { "for ", 4, skip_addr } +}; + +static void +skip_atom (const char **in) +{ + register const char *inptr; + + decode_lwsp (in); + inptr = *in; + while (is_atom (*inptr)) + inptr++; + *in = inptr; +} + +static void +skip_comment (const char **in) +{ + register const char *inptr = *in; + int depth = 1; + + if (*inptr == '(') + inptr++; + + while (*inptr && depth > 0) { + if (*inptr == '(') + depth++; + else if (*inptr == ')') + depth--; + inptr++; + } + + if (*inptr == ')') + inptr++; + + *in = inptr; +} + +static void +skip_quoted_string (const char **in) +{ + const char *inptr = *in; + + decode_lwsp (&inptr); + if (*inptr == '"') { + inptr++; + while (*inptr && *inptr != '"') { + if (*inptr == '\\') + inptr++; + + if (*inptr) + inptr++; + } + + if (*inptr == '"') + inptr++; + } + + *in = inptr; +} + +static void +skip_word (const char **in) +{ + decode_lwsp (in); + if (**in == '"') { + skip_quoted_string (in); + } else { + skip_atom (in); + } +} + +static void +skip_domain_subliteral (const char **in) +{ + const char *inptr = *in; + + while (*inptr && *inptr != '.' && *inptr != ']') { + if (is_dtext (*inptr)) { + inptr++; + } else if (is_lwsp (*inptr)) { + decode_lwsp (&inptr); + } else { + break; + } + } + + *in = inptr; +} + +static void +skip_domain_literal (const char **in) +{ + const char *inptr = *in; + + decode_lwsp (&inptr); + while (*inptr && *inptr != ']') { + skip_domain_subliteral (&inptr); + if (*inptr && *inptr != ']') + inptr++; + } + + *in = inptr; +} + +static void +skip_domain (const char **in) +{ + const char *save, *inptr = *in; + + while (inptr && *inptr) { + decode_lwsp (&inptr); + if (*inptr == '[') { + /* domain literal */ + inptr++; + skip_domain_literal (&inptr); + if (*inptr == ']') + inptr++; + } else { + skip_atom (&inptr); + } + + save = inptr; + decode_lwsp (&inptr); + if (*inptr != '.') { + inptr = save; + break; + } + + inptr++; + } + + *in = inptr; +} + +static void +skip_addrspec (const char **in) +{ + const char *inptr = *in; + + decode_lwsp (&inptr); + skip_word (&inptr); + decode_lwsp (&inptr); + + while (*inptr == '.') { + inptr++; + skip_word (&inptr); + decode_lwsp (&inptr); + } + + if (*inptr == '@') { + inptr++; + skip_domain (&inptr); + } + + *in = inptr; +} + +static void +skip_addr (const char **in) +{ + const char *inptr = *in; + + decode_lwsp (&inptr); + if (*inptr == '<') { + inptr++; + skip_addrspec (&inptr); + if (*inptr == '>') + inptr++; + } else { + skip_addrspec (&inptr); + } + + *in = inptr; +} + +static void +skip_msgid (const char **in) +{ + const char *inptr = *in; + + decode_lwsp (&inptr); + if (*inptr == '<') { + inptr++; + skip_addrspec (&inptr); + if (*inptr == '>') + inptr++; + } else { + skip_atom (&inptr); + } + + *in = inptr; +} + + +struct _received_part { + struct _received_part *next; + const char *start; + size_t len; +}; + +static ssize_t +write_received (GMimeStream *stream, const char *name, const char *value) +{ + struct _received_part *parts, *part, *tail; + const char *inptr, *lwsp = NULL; + ssize_t nwritten; + GString *str; + size_t len; + guint i; + + while (is_lwsp (*value)) + value++; + + if (*value == '\0') + return 0; + + str = g_string_new (name); + g_string_append_len (str, ": ", 2); + len = 10; + + tail = parts = part = g_alloca (sizeof (struct _received_part)); + part->start = inptr = value; + part->next = NULL; + + while (*inptr) { + for (i = 0; i < G_N_ELEMENTS (received_tokens); i++) { + if (!strncmp (inptr, received_tokens[i].token, received_tokens[i].len)) { + if (inptr > part->start) { + g_assert (lwsp != NULL); + part->len = lwsp - part->start; + + part = g_alloca (sizeof (struct _received_part)); + part->start = inptr; + part->next = NULL; + + tail->next = part; + tail = part; + } + + inptr += received_tokens[i].len; + received_tokens[i].skip (&inptr); + + lwsp = inptr; + while (is_lwsp (*inptr)) + inptr++; + + if (*inptr == ';') { + inptr++; + + part->len = inptr - part->start; + + lwsp = inptr; + while (is_lwsp (*inptr)) + inptr++; + + part = g_alloca (sizeof (struct _received_part)); + part->start = inptr; + part->next = NULL; + + tail->next = part; + tail = part; + } + + break; + } + } + + if (i == G_N_ELEMENTS (received_tokens)) { + while (*inptr && !is_lwsp (*inptr)) + inptr++; + + lwsp = inptr; + while (is_lwsp (*inptr)) + inptr++; + } + + if (*inptr == '(') { + skip_comment (&inptr); + + lwsp = inptr; + while (is_lwsp (*inptr)) + inptr++; + } + } + + part->len = lwsp - part->start; + + lwsp = NULL; + part = parts; + do { + len += lwsp ? part->start - lwsp : 0; + if (len + part->len > GMIME_FOLD_LEN && part != parts) { + g_string_append (str, "\n\t"); + len = 1; + } else if (lwsp) { + g_string_append_len (str, lwsp, (size_t) (part->start - lwsp)); + } + + g_string_append_len (str, part->start, part->len); + lwsp = part->start + part->len; + len += part->len; + + part = part->next; + } while (part != NULL); + + g_string_append_c (str, '\n'); + + nwritten = g_mime_stream_write (stream, str->str, str->len); + g_string_free (str, TRUE); + + return nwritten; +} + +static ssize_t +write_subject (GMimeStream *stream, const char *name, const char *value) +{ + char *unfolded, *folded; + ssize_t n; + + unfolded = g_strdup_printf ("%s: %s\n", name, value); + folded = g_mime_utils_unstructured_header_fold (unfolded); + g_free (unfolded); + + n = g_mime_stream_write_string (stream, folded); + g_free (folded); + + return n; +} + +static ssize_t +write_msgid (GMimeStream *stream, const char *name, const char *value) +{ + /* we don't want to wrap the Message-Id header - seems to + break a lot of clients (and servers) */ + return g_mime_stream_printf (stream, "%s: %s\n", name, value); +} + +static ssize_t +write_structured (GMimeStream *stream, const char *name, const char *value) +{ + char *unfolded, *folded; + ssize_t n; + + unfolded = g_strdup_printf ("%s: %s\n", name, value); + folded = g_mime_utils_structured_header_fold (unfolded); + g_free (unfolded); + + n = g_mime_stream_write_string (stream, folded); + g_free (folded); + + return n; +} + +static ssize_t +write_addrspec (GMimeStream *stream, const char *name, const char *value) +{ + InternetAddressList *addrlist; + GString *str; + ssize_t n; + + str = g_string_new (name); + g_string_append (str, ": "); + + if (value && (addrlist = internet_address_list_parse_string (value))) { + internet_address_list_writer (addrlist, str); + g_object_unref (addrlist); + } + + g_string_append_c (str, '\n'); + + n = g_mime_stream_write (stream, str->str, str->len); + g_string_free (str, TRUE); + + return n; +} + +enum { + HEADER_FROM, + HEADER_REPLY_TO, + HEADER_TO, + HEADER_CC, + HEADER_BCC, + HEADER_SUBJECT, + HEADER_DATE, + HEADER_MESSAGE_ID, + HEADER_MIME_VERSION, + HEADER_UNKNOWN +}; + +static const char *message_headers[] = { + "From", + "Reply-To", + "To", + "Cc", + "Bcc", + "Subject", + "Date", + "Message-Id", + "MIME-Version", +}; + +enum { + PREPEND, + APPEND, + SET +}; + +static void +message_add_recipients_from_string (GMimeMessage *message, int action, GMimeRecipientType type, const char *str) +{ + InternetAddressList *recipients, *addrlist; + + recipients = g_mime_message_get_recipients (message, type); + + if (action == SET) + internet_address_list_clear (recipients); + + if ((addrlist = internet_address_list_parse_string (str))) { + if (action == PREPEND) + internet_address_list_prepend (recipients, addrlist); + else + internet_address_list_append (recipients, addrlist); + + g_object_unref (addrlist); + } +} + +static gboolean +process_header (GMimeObject *object, int action, const char *header, const char *value) +{ + GMimeMessage *message = (GMimeMessage *) object; + InternetAddressList *addrlist; + time_t date; + int offset; + guint i; + + for (i = 0; i < G_N_ELEMENTS (message_headers); i++) { + if (!g_ascii_strcasecmp (message_headers[i], header)) + break; + } + + switch (i) { + case HEADER_FROM: + g_free (message->from); + if ((addrlist = internet_address_list_parse_string (value))) { + message->from = internet_address_list_to_string (addrlist, FALSE); + g_object_unref (addrlist); + } else { + message->from = NULL; + } + break; + case HEADER_REPLY_TO: + g_free (message->reply_to); + if ((addrlist = internet_address_list_parse_string (value))) { + message->reply_to = internet_address_list_to_string (addrlist, FALSE); + g_object_unref (addrlist); + } else { + message->reply_to = NULL; + } + break; + case HEADER_TO: + block_changed_event (message, GMIME_RECIPIENT_TYPE_TO); + message_add_recipients_from_string (message, action, GMIME_RECIPIENT_TYPE_TO, value); + unblock_changed_event (message, GMIME_RECIPIENT_TYPE_TO); + break; + case HEADER_CC: + block_changed_event (message, GMIME_RECIPIENT_TYPE_CC); + message_add_recipients_from_string (message, action, GMIME_RECIPIENT_TYPE_CC, value); + unblock_changed_event (message, GMIME_RECIPIENT_TYPE_CC); + break; + case HEADER_BCC: + block_changed_event (message, GMIME_RECIPIENT_TYPE_BCC); + message_add_recipients_from_string (message, action, GMIME_RECIPIENT_TYPE_BCC, value); + unblock_changed_event (message, GMIME_RECIPIENT_TYPE_BCC); + break; + case HEADER_SUBJECT: + g_free (message->subject); + message->subject = g_mime_utils_header_decode_text (value); + break; + case HEADER_DATE: + if (value) { + date = g_mime_utils_header_decode_date (value, &offset); + message->date = date; + message->tz_offset = offset; + } + break; + case HEADER_MESSAGE_ID: + g_free (message->message_id); + message->message_id = g_mime_utils_decode_message_id (value); + break; + case HEADER_MIME_VERSION: + break; + default: + return FALSE; + } + + return TRUE; +} + +static void +message_prepend_header (GMimeObject *object, const char *header, const char *value) +{ + GMimeMessage *message = (GMimeMessage *) object; + + /* Content-* headers don't belong on the message, they belong on the part. */ + if (!g_ascii_strncasecmp ("Content-", header, 8)) { + if (message->mime_part) + g_mime_object_prepend_header (message->mime_part, header, value); + return; + } + + if (!process_header (object, PREPEND, header, value)) + GMIME_OBJECT_CLASS (parent_class)->prepend_header (object, header, value); + else + g_mime_header_list_prepend (object->headers, header, value); + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); +} + +static void +message_append_header (GMimeObject *object, const char *header, const char *value) +{ + GMimeMessage *message = (GMimeMessage *) object; + + /* Content-* headers don't belong on the message, they belong on the part. */ + if (!g_ascii_strncasecmp ("Content-", header, 8)) { + if (message->mime_part) + g_mime_object_append_header (message->mime_part, header, value); + return; + } + + if (!process_header (object, APPEND, header, value)) + GMIME_OBJECT_CLASS (parent_class)->append_header (object, header, value); + else + g_mime_header_list_append (object->headers, header, value); + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); +} + +static void +message_set_header (GMimeObject *object, const char *header, const char *value) +{ + GMimeMessage *message = (GMimeMessage *) object; + + /* Content-* headers don't belong on the message, they belong on the part. */ + if (!g_ascii_strncasecmp ("Content-", header, 8)) { + if (message->mime_part) + g_mime_object_set_header (message->mime_part, header, value); + return; + } + + if (!process_header (object, SET, header, value)) + GMIME_OBJECT_CLASS (parent_class)->set_header (object, header, value); + else + g_mime_header_list_set (object->headers, header, value); + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); +} + +static const char * +message_get_header (GMimeObject *object, const char *header) +{ + GMimeMessage *message = (GMimeMessage *) object; + const char *value; + + /* Content-* headers don't belong on the message, they belong on the part. */ + if (g_ascii_strncasecmp ("Content-", header, 8) != 0) { + if ((value = GMIME_OBJECT_CLASS (parent_class)->get_header (object, header))) + return value; + + if (!g_ascii_strcasecmp ("MIME-Version", header)) + return "1.0"; + } else if (message->mime_part) { + return g_mime_object_get_header (message->mime_part, header); + } + + return NULL; +} + +static gboolean +message_remove_header (GMimeObject *object, const char *header) +{ + GMimeMessage *message = (GMimeMessage *) object; + InternetAddressList *addrlist; + GMimeRecipientType type; + guint i; + + /* Content-* headers don't belong on the message, they belong on the part. */ + if (!g_ascii_strncasecmp ("Content-", header, 8)) { + if (message->mime_part) + return g_mime_object_remove_header (message->mime_part, header); + + return FALSE; + } + + for (i = 0; i < G_N_ELEMENTS (message_headers); i++) { + if (!g_ascii_strcasecmp (message_headers[i], header)) + break; + } + + switch (i) { + case HEADER_FROM: + g_free (message->from); + message->from = NULL; + break; + case HEADER_REPLY_TO: + g_free (message->reply_to); + message->reply_to = NULL; + break; + case HEADER_TO: + type = GMIME_RECIPIENT_TYPE_TO; + block_changed_event (message, type); + addrlist = message->recipients[type]; + internet_address_list_clear (addrlist); + unblock_changed_event (message, type); + break; + case HEADER_CC: + type = GMIME_RECIPIENT_TYPE_CC; + block_changed_event (message, type); + addrlist = message->recipients[type]; + internet_address_list_clear (addrlist); + unblock_changed_event (message, type); + break; + case HEADER_BCC: + type = GMIME_RECIPIENT_TYPE_BCC; + block_changed_event (message, type); + addrlist = message->recipients[type]; + internet_address_list_clear (addrlist); + unblock_changed_event (message, type); + break; + case HEADER_SUBJECT: + g_free (message->subject); + message->subject = NULL; + break; + case HEADER_DATE: + message->date = 0; + message->tz_offset = 0; + break; + case HEADER_MESSAGE_ID: + g_free (message->message_id); + message->message_id = NULL; + break; + default: + break; + } + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); + + return GMIME_OBJECT_CLASS (parent_class)->remove_header (object, header); +} + + +static char * +message_get_headers (GMimeObject *object) +{ + GMimeMessage *message = (GMimeMessage *) object; + GMimeStream *stream; + GByteArray *ba; + char *str; + + ba = g_byte_array_new (); + stream = g_mime_stream_mem_new (); + g_mime_stream_mem_set_byte_array (GMIME_STREAM_MEM (stream), ba); + + if (message->mime_part && g_mime_header_list_get_stream (message->mime_part->headers)) { + /* if the mime part has raw headers, then it contains the message headers as well */ + g_mime_header_list_write_to_stream (message->mime_part->headers, stream); + } else { + g_mime_header_list_write_to_stream (object->headers, stream); + if (message->mime_part) { + if (g_mime_object_get_header (message->mime_part, "Content-Type") && + !g_mime_header_list_get (object->headers, "MIME-Version")) + g_mime_stream_write_string (stream, "MIME-Version: 1.0\n"); + g_mime_header_list_write_to_stream (message->mime_part->headers, stream); + } + } + + g_object_unref (stream); + g_byte_array_append (ba, (unsigned char *) "", 1); + str = (char *) ba->data; + g_byte_array_free (ba, FALSE); + + return str; +} + +static ssize_t +message_write_to_stream (GMimeObject *object, GMimeStream *stream) +{ + GMimeMessage *message = (GMimeMessage *) object; + ssize_t nwritten, total = 0; + + if (message->mime_part) { + if (!g_mime_header_list_get_stream (message->mime_part->headers)) { + if ((nwritten = g_mime_header_list_write_to_stream (object->headers, stream)) == -1) + return -1; + + total += nwritten; + + if (!g_mime_header_list_get (object->headers, "MIME-Version")) { + if ((nwritten = g_mime_stream_write_string (stream, "MIME-Version: 1.0\n")) == -1) + return -1; + } + + total += nwritten; + } + + if ((nwritten = g_mime_object_write_to_stream (message->mime_part, stream)) == -1) + return -1; + } else { + if ((nwritten = g_mime_header_list_write_to_stream (object->headers, stream)) == -1) + return -1; + + total += nwritten; + + if ((nwritten = g_mime_stream_write (stream, "\n", 1)) == -1) + return -1; + } + + total += nwritten; + + return total; +} + +static void +message_encode (GMimeObject *object, GMimeEncodingConstraint constraint) +{ + GMimeMessage *message = (GMimeMessage *) object; + + if (message->mime_part != NULL) + g_mime_object_encode (message->mime_part, constraint); +} + + + +/** + * g_mime_message_new: + * @pretty_headers: make pretty headers + * + * If @pretty_headers is %TRUE, then the standard rfc822 headers are + * initialized so as to put headers in a nice friendly order. This is + * strictly a cosmetic thing, so if you are unsure, it is safe to say + * no (%FALSE). + * + * Returns: an empty #GMimeMessage object. + **/ +GMimeMessage * +g_mime_message_new (gboolean pretty_headers) +{ + GMimeHeaderList *headers; + GMimeMessage *message; + guint i; + + message = g_object_newv (GMIME_TYPE_MESSAGE, 0, NULL); + + if (pretty_headers) { + /* Populate with the "standard" rfc822 headers so we can have a standard order */ + headers = ((GMimeObject *) message)->headers; + for (i = 0; i < G_N_ELEMENTS (rfc822_headers); i++) + g_mime_header_list_set (headers, rfc822_headers[i], NULL); + } + + return message; +} + + +/** + * g_mime_message_set_sender: + * @message: MIME Message to change + * @sender: The name and address of the sender + * + * Set the sender's name and address on the MIME Message. + * (ex: "\"Joe Sixpack\" <joe@sixpack.org>") + **/ +void +g_mime_message_set_sender (GMimeMessage *message, const char *sender) +{ + InternetAddressList *addrlist; + char *encoded; + + g_return_if_fail (GMIME_IS_MESSAGE (message)); + g_return_if_fail (sender != NULL); + + g_free (message->from); + + if ((addrlist = internet_address_list_parse_string (sender))) { + message->from = internet_address_list_to_string (addrlist, FALSE); + encoded = internet_address_list_to_string (addrlist, TRUE); + g_mime_header_list_set (GMIME_OBJECT (message)->headers, "From", encoded); + g_object_unref (addrlist); + g_free (encoded); + } else { + g_mime_header_list_set (GMIME_OBJECT (message)->headers, "From", ""); + message->from = NULL; + } + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); +} + + +/** + * g_mime_message_get_sender: + * @message: MIME Message + * + * Gets the email address of the sender from @message. + * + * Returns: the sender's name and address of the MIME Message. + **/ +const char * +g_mime_message_get_sender (GMimeMessage *message) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + + return message->from; +} + + +/** + * g_mime_message_set_reply_to: + * @message: MIME Message to change + * @reply_to: The Reply-To address + * + * Set the sender's Reply-To address on the MIME Message. + **/ +void +g_mime_message_set_reply_to (GMimeMessage *message, const char *reply_to) +{ + g_return_if_fail (GMIME_IS_MESSAGE (message)); + g_return_if_fail (reply_to != NULL); + + g_free (message->reply_to); + message->reply_to = g_mime_strdup_trim (reply_to); + + g_mime_header_list_set (GMIME_OBJECT (message)->headers, "Reply-To", message->reply_to); + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); +} + + +/** + * g_mime_message_get_reply_to: + * @message: MIME Message + * + * Gets the Reply-To address from @message. + * + * Returns: the sender's Reply-To address from the MIME Message. + **/ +const char * +g_mime_message_get_reply_to (GMimeMessage *message) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + + return message->reply_to; +} + + +static void +sync_recipient_header (GMimeMessage *message, GMimeRecipientType type) +{ + GMimeObject *object = (GMimeObject *) message; + const char *name = recipient_types[type].name; + InternetAddressList *list; + char *string; + + /* sync the specified recipient header */ + if ((list = g_mime_message_get_recipients (message, type))) { + string = internet_address_list_to_string (list, TRUE); + g_mime_header_list_set (object->headers, name, string); + g_free (string); + } else { + /* list should never be NULL... */ + g_mime_header_list_set (object->headers, name, NULL); + } + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); +} + +static void +to_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message) +{ + sync_recipient_header (message, GMIME_RECIPIENT_TYPE_TO); +} + +static void +cc_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message) +{ + sync_recipient_header (message, GMIME_RECIPIENT_TYPE_CC); +} + +static void +bcc_list_changed (InternetAddressList *list, gpointer args, GMimeMessage *message) +{ + sync_recipient_header (message, GMIME_RECIPIENT_TYPE_BCC); +} + + +/** + * g_mime_message_add_recipient: + * @message: MIME Message to change + * @type: A #GMimeRecipientType + * @name: The recipient's name (or %NULL) + * @addr: The recipient's address + * + * Add a recipient of a chosen type to the MIME Message. + **/ +void +g_mime_message_add_recipient (GMimeMessage *message, GMimeRecipientType type, const char *name, const char *addr) +{ + InternetAddressList *recipients; + InternetAddress *ia; + + g_return_if_fail (GMIME_IS_MESSAGE (message)); + g_return_if_fail (type < N_RECIPIENT_TYPES); + g_return_if_fail (addr != NULL); + + recipients = message->recipients[type]; + ia = internet_address_mailbox_new (name, addr); + internet_address_list_add (recipients, ia); + g_object_unref (ia); + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); + + g_mime_header_list_set_stream (((GMimeObject *) message)->headers, NULL); +} + + +/** + * g_mime_message_get_recipients: + * @message: MIME Message + * @type: A #GMimeRecipientType + * + * Gets a list of recipients of type @type from @message. + * + * Returns: a list of recipients of a chosen type from the MIME + * Message. + **/ +InternetAddressList * +g_mime_message_get_recipients (GMimeMessage *message, GMimeRecipientType type) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + g_return_val_if_fail (type < N_RECIPIENT_TYPES, NULL); + + return message->recipients[type]; +} + + +/** + * g_mime_message_get_all_recipients: + * @message: MIME Message + * + * Gets the complete list of recipients for @message. + * + * Returns: a newly allocated #InternetAddressList containing all + * recipients of the message or %NULL if no recipients are set. + **/ +InternetAddressList * +g_mime_message_get_all_recipients (GMimeMessage *message) +{ + InternetAddressList *recipients, *list = NULL; + guint i; + + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + + for (i = 0; i < N_RECIPIENT_TYPES; i++) { + recipients = message->recipients[i]; + + if (internet_address_list_length (recipients) == 0) + continue; + + if (list == NULL) + list = internet_address_list_new (); + + internet_address_list_append (list, recipients); + } + + return list; +} + + +/** + * g_mime_message_set_subject: + * @message: MIME Message + * @subject: Subject string + * + * Set the unencoded UTF-8 Subject field on a MIME Message. + **/ +void +g_mime_message_set_subject (GMimeMessage *message, const char *subject) +{ + char *encoded; + + g_return_if_fail (GMIME_IS_MESSAGE (message)); + g_return_if_fail (subject != NULL); + + g_free (message->subject); + message->subject = g_mime_strdup_trim (subject); + + encoded = g_mime_utils_header_encode_text (message->subject); + g_mime_object_set_header (GMIME_OBJECT (message), "Subject", encoded); + g_free (encoded); + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); +} + + +/** + * g_mime_message_get_subject: + * @message: MIME Message + * + * Gets the message's subject. + * + * Returns: the unencoded UTF-8 Subject field on a MIME Message. + **/ +const char * +g_mime_message_get_subject (GMimeMessage *message) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + + return message->subject; +} + + +/** + * g_mime_message_set_date: + * @message: MIME Message + * @date: a date to be used in the Date header + * @tz_offset: timezone offset (in +/- hours) + * + * Sets the Date header on a MIME Message. + **/ +void +g_mime_message_set_date (GMimeMessage *message, time_t date, int tz_offset) +{ + char *str; + + g_return_if_fail (GMIME_IS_MESSAGE (message)); + + message->date = date; + message->tz_offset = tz_offset; + + str = g_mime_utils_header_format_date (date, tz_offset); + g_mime_object_set_header (GMIME_OBJECT (message), "Date", str); + g_free (str); + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); +} + + +/** + * g_mime_message_get_date: + * @message: MIME Message + * @date: pointer to a date in time_t + * @tz_offset: pointer to timezone offset (in +/- hours) + * + * Stores the date in time_t format in @date. If @tz_offset is + * non-%NULL, then the timezone offset in will be stored in + * @tz_offset. + **/ +void +g_mime_message_get_date (GMimeMessage *message, time_t *date, int *tz_offset) +{ + g_return_if_fail (GMIME_IS_MESSAGE (message)); + g_return_if_fail (date != NULL); + + *date = message->date; + + if (tz_offset) + *tz_offset = message->tz_offset; +} + + +/** + * g_mime_message_get_date_as_string: + * @message: MIME Message + * + * Gets the message's sent-date in string format. + * + * Returns: a newly allocated string containing the Date header value. + **/ +char * +g_mime_message_get_date_as_string (GMimeMessage *message) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + + return g_mime_utils_header_format_date (message->date, message->tz_offset); +} + + +/** + * g_mime_message_set_date_as_string: + * @message: MIME Message + * @str: a date string + * + * Sets the sent-date of the message. + **/ +void +g_mime_message_set_date_as_string (GMimeMessage *message, const char *str) +{ + int tz_offset; + time_t date; + char *buf; + + g_return_if_fail (GMIME_IS_MESSAGE (message)); + + date = g_mime_utils_header_decode_date (str, &tz_offset); + message->tz_offset = tz_offset; + message->date = date; + + buf = g_mime_utils_header_format_date (date, tz_offset); + g_mime_object_set_header (GMIME_OBJECT (message), "Date", buf); + g_free (buf); + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); +} + + +/** + * g_mime_message_set_message_id: + * @message: MIME Message + * @message_id: message-id (addr-spec portion) + * + * Set the Message-Id on a message. + **/ +void +g_mime_message_set_message_id (GMimeMessage *message, const char *message_id) +{ + char *msgid; + + g_return_if_fail (GMIME_IS_MESSAGE (message)); + g_return_if_fail (message_id != NULL); + + g_free (message->message_id); + message->message_id = g_mime_strdup_trim (message_id); + + msgid = g_strdup_printf ("<%s>", message_id); + g_mime_object_set_header (GMIME_OBJECT (message), "Message-Id", msgid); + g_free (msgid); + + if (message->mime_part) + g_mime_header_list_set_stream (message->mime_part->headers, NULL); +} + + +/** + * g_mime_message_get_message_id: + * @message: MIME Message + * + * Gets the Message-Id header of @message. + * + * Returns: the Message-Id of a message. + **/ +const char * +g_mime_message_get_message_id (GMimeMessage *message) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + + return message->message_id; +} + + +/** + * g_mime_message_get_mime_part: + * @message: MIME Message + * + * Gets the toplevel MIME part contained within @message. + * + * Returns: the toplevel MIME part of @message. + **/ +GMimeObject * +g_mime_message_get_mime_part (GMimeMessage *message) +{ + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + + if (message->mime_part == NULL) + return NULL; + + return message->mime_part; +} + + +/** + * g_mime_message_set_mime_part: + * @message: MIME Message + * @mime_part: The root-level MIME Part + * + * Set the root-level MIME part of the message. + **/ +void +g_mime_message_set_mime_part (GMimeMessage *message, GMimeObject *mime_part) +{ + GMimeEvent *changed; + + g_return_if_fail (mime_part == NULL || GMIME_IS_OBJECT (mime_part)); + g_return_if_fail (GMIME_IS_MESSAGE (message)); + + if (message->mime_part == mime_part) + return; + + if (message->mime_part) { + changed = _g_mime_header_list_get_changed_event (message->mime_part->headers); + g_mime_event_remove (changed, (GMimeEventCallback) mime_part_headers_changed, message); + + g_mime_header_list_set_stream (message->mime_part->headers, NULL); + g_object_unref (message->mime_part); + } + + if (mime_part) { + changed = _g_mime_header_list_get_changed_event (mime_part->headers); + g_mime_header_list_set_stream (mime_part->headers, NULL); + g_mime_event_add (changed, (GMimeEventCallback) mime_part_headers_changed, message); + g_object_ref (mime_part); + } + + g_mime_header_list_set_stream (((GMimeObject *) message)->headers, NULL); + + message->mime_part = mime_part; +} + + +/** + * g_mime_message_foreach: + * @message: a #GMimeMessage + * @callback: function to call on each of the mime parts contained by the mime message + * @user_data: user-supplied callback data + * + * Recursively calls @callback on each of the mime parts in the mime message. + **/ +void +g_mime_message_foreach (GMimeMessage *message, GMimeObjectForeachFunc callback, gpointer user_data) +{ + g_return_if_fail (GMIME_IS_MESSAGE (message)); + g_return_if_fail (callback != NULL); + + callback ((GMimeObject *) message, message->mime_part, user_data); + + if (GMIME_IS_MULTIPART (message->mime_part)) + g_mime_multipart_foreach ((GMimeMultipart *) message->mime_part, callback, user_data); +} + +static gboolean +part_is_textual (GMimeObject *mime_part) +{ + GMimeContentType *type; + + type = g_mime_object_get_content_type (mime_part); + + return g_mime_content_type_is_type (type, "text", "*"); +} + +static GMimeObject * +multipart_guess_body (GMimeMultipart *multipart) +{ + GMimeContentType *type; + GMimeObject *mime_part; + int count, i; + + if (GMIME_IS_MULTIPART_ENCRYPTED (multipart)) { + /* nothing more we can do */ + return (GMimeObject *) multipart; + } + + type = g_mime_object_get_content_type ((GMimeObject *) multipart); + if (g_mime_content_type_is_type (type, "multipart", "alternative")) { + /* very likely that this is the body - leave it up to + * our caller to decide which format of the body it + * wants to use. */ + return (GMimeObject *) multipart; + } + + count = g_mime_multipart_get_count (multipart); + + if (count >= 1 && GMIME_IS_MULTIPART_SIGNED (multipart)) { + /* if the body is in here, it has to be the first part */ + count = 1; + } + + for (i = 0; i < count; i++) { + mime_part = g_mime_multipart_get_part (multipart, i); + + if (GMIME_IS_MULTIPART (mime_part)) { + if ((mime_part = multipart_guess_body ((GMimeMultipart *) mime_part))) + return mime_part; + } else if (GMIME_IS_PART (mime_part)) { + if (part_is_textual (mime_part)) + return mime_part; + } + } + + return NULL; +} + + +/** + * g_mime_message_get_body: + * @message: MIME Message + * + * Attempts to identify the MIME part containing the body of the + * message. + * + * Returns: a #GMimeObject containing the textual content that appears + * to be the main body of the message. + * + * Note: This function is NOT guarenteed to always work as it + * makes some assumptions that are not necessarily true. It is + * recommended that you traverse the MIME structure yourself. + **/ +GMimeObject * +g_mime_message_get_body (GMimeMessage *message) +{ + GMimeObject *mime_part; + + g_return_val_if_fail (GMIME_IS_MESSAGE (message), NULL); + + if (!(mime_part = message->mime_part)) + return NULL; + + if (GMIME_IS_MULTIPART (mime_part)) + return multipart_guess_body ((GMimeMultipart *) mime_part); + else if (GMIME_IS_PART (mime_part) && part_is_textual (mime_part)) + return mime_part; + + return NULL; +} diff --git a/gmime/gmime-message.h b/gmime/gmime-message.h new file mode 100644 index 0000000..d34333a --- /dev/null +++ b/gmime/gmime-message.h @@ -0,0 +1,133 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_MESSAGE_H__ +#define __GMIME_MESSAGE_H__ + +#include +#include + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_MESSAGE (g_mime_message_get_type ()) +#define GMIME_MESSAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_MESSAGE, GMimeMessage)) +#define GMIME_MESSAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_MESSAGE, GMimeMessageClass)) +#define GMIME_IS_MESSAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_MESSAGE)) +#define GMIME_IS_MESSAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_MESSAGE)) +#define GMIME_MESSAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_MESSAGE, GMimeMessageClass)) + +typedef struct _GMimeMessage GMimeMessage; +typedef struct _GMimeMessageClass GMimeMessageClass; + + +/** + * GMimeRecipientType: + * @GMIME_RECIPIENT_TYPE_TO: Represents the recipients in the To: header. + * @GMIME_RECIPIENT_TYPE_CC: Represents the recipients in the Cc: header. + * @GMIME_RECIPIENT_TYPE_BCC: Represents the recipients in the Bcc: header. + * + * A message recipient type. + **/ +typedef enum _GMimeRecipientType { + GMIME_RECIPIENT_TYPE_TO, + GMIME_RECIPIENT_TYPE_CC, + GMIME_RECIPIENT_TYPE_BCC +} GMimeRecipientType; + + +/** + * GMimeMessage: + * @parent_object: parent #GMimeObject + * @mime_part: toplevel MIME part + * @recipients: hash table of recipients using recipient header name as the hash key + * @message_id: Message-Id string + * @reply_to: Reply-To string + * @subject: Subject string + * @from: From string + * @date: Date value + * @tz_offset: timezone offset + * + * A MIME Message object. + **/ +struct _GMimeMessage { + GMimeObject parent_object; + + InternetAddressList **recipients; + GMimeObject *mime_part; + char *message_id; + char *reply_to; + char *subject; + char *from; + + time_t date; + int tz_offset; +}; + +struct _GMimeMessageClass { + GMimeObjectClass parent_class; + +}; + + +GType g_mime_message_get_type (void); + +GMimeMessage *g_mime_message_new (gboolean pretty_headers); + +void g_mime_message_set_sender (GMimeMessage *message, const char *sender); +const char *g_mime_message_get_sender (GMimeMessage *message); + +void g_mime_message_set_reply_to (GMimeMessage *message, const char *reply_to); +const char *g_mime_message_get_reply_to (GMimeMessage *message); + +void g_mime_message_add_recipient (GMimeMessage *message, GMimeRecipientType type, const char *name, const char *addr); +InternetAddressList *g_mime_message_get_recipients (GMimeMessage *message, GMimeRecipientType type); +InternetAddressList *g_mime_message_get_all_recipients (GMimeMessage *message); + +void g_mime_message_set_subject (GMimeMessage *message, const char *subject); +const char *g_mime_message_get_subject (GMimeMessage *message); + +void g_mime_message_set_date (GMimeMessage *message, time_t date, int tz_offset); +void g_mime_message_get_date (GMimeMessage *message, time_t *date, int *tz_offset); +void g_mime_message_set_date_as_string (GMimeMessage *message, const char *str); +char *g_mime_message_get_date_as_string (GMimeMessage *message); + +void g_mime_message_set_message_id (GMimeMessage *message, const char *message_id); +const char *g_mime_message_get_message_id (GMimeMessage *message); + +GMimeObject *g_mime_message_get_mime_part (GMimeMessage *message); +void g_mime_message_set_mime_part (GMimeMessage *message, GMimeObject *mime_part); + +/* convenience functions */ + +void g_mime_message_foreach (GMimeMessage *message, GMimeObjectForeachFunc callback, + gpointer user_data); + +GMimeObject *g_mime_message_get_body (GMimeMessage *message); + +G_END_DECLS + +#endif /* __GMIME_MESSAGE_H__ */ diff --git a/gmime/gmime-multipart-encrypted.c b/gmime/gmime-multipart-encrypted.c new file mode 100644 index 0000000..0cd3df3 --- /dev/null +++ b/gmime/gmime-multipart-encrypted.c @@ -0,0 +1,405 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gmime-multipart-encrypted.h" +#include "gmime-stream-filter.h" +#include "gmime-filter-basic.h" +#include "gmime-filter-from.h" +#include "gmime-filter-crlf.h" +#include "gmime-stream-mem.h" +#include "gmime-parser.h" +#include "gmime-part.h" +#include "gmime-error.h" + +#ifdef ENABLE_DEBUG +#define d(x) x +#else +#define d(x) +#endif + +#define _(x) x + + +/** + * SECTION: gmime-multipart-encrypted + * @title: GMimeMultipartEncrypted + * @short_description: Encrypted MIME multiparts + * @see_also: #GMimeMultipart + * + * A #GMimeMultipartEncrypted part is a special subclass of + * #GMimeMultipart to make it easier to manipulate the + * multipart/encrypted MIME type. + **/ + + +/* GObject class methods */ +static void g_mime_multipart_encrypted_class_init (GMimeMultipartEncryptedClass *klass); +static void g_mime_multipart_encrypted_init (GMimeMultipartEncrypted *mps, GMimeMultipartEncryptedClass *klass); +static void g_mime_multipart_encrypted_finalize (GObject *object); + + +static GMimeMultipartClass *parent_class = NULL; + + +GType +g_mime_multipart_encrypted_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeMultipartEncryptedClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_multipart_encrypted_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeMultipartEncrypted), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_multipart_encrypted_init, + }; + + type = g_type_register_static (GMIME_TYPE_MULTIPART, "GMimeMultipartEncrypted", &info, 0); + } + + return type; +} + + +static void +g_mime_multipart_encrypted_class_init (GMimeMultipartEncryptedClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_MULTIPART); + + gobject_class->finalize = g_mime_multipart_encrypted_finalize; +} + +static void +g_mime_multipart_encrypted_init (GMimeMultipartEncrypted *mpe, GMimeMultipartEncryptedClass *klass) +{ + +} + +static void +g_mime_multipart_encrypted_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +/** + * g_mime_multipart_encrypted_new: + * + * Creates a new MIME multipart/encrypted object. + * + * Returns: an empty MIME multipart/encrypted object. + **/ +GMimeMultipartEncrypted * +g_mime_multipart_encrypted_new (void) +{ + GMimeMultipartEncrypted *multipart; + GMimeContentType *content_type; + + multipart = g_object_newv (GMIME_TYPE_MULTIPART_ENCRYPTED, 0, NULL); + + content_type = g_mime_content_type_new ("multipart", "encrypted"); + g_mime_object_set_content_type (GMIME_OBJECT (multipart), content_type); + g_object_unref (content_type); + + return multipart; +} + + +/** + * g_mime_multipart_encrypted_encrypt: + * @mpe: multipart/encrypted object + * @content: MIME part to encrypt + * @ctx: encryption context + * @sign: %TRUE if the content should also be signed or %FALSE otherwise + * @userid: user id to use for signing (only used if @sign is %TRUE) + * @digest: digest algorithm to use when signing + * @recipients: an array of recipients to encrypt to + * @err: a #GError + * + * Attempts to encrypt (and conditionally sign) the @content MIME part + * to the public keys of @recipients using the @ctx encryption + * context. If successful, the encrypted #GMimeObject is set as the + * encrypted part of the multipart/encrypted object @mpe. + * + * Returns: %0 on success or %-1 on fail. If the encryption fails, an + * exception will be set on @err to provide information as to why the + * failure occured. + **/ +int +g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *content, + GMimeCryptoContext *ctx, gboolean sign, + const char *userid, GMimeDigestAlgo digest, + GPtrArray *recipients, GError **err) +{ + GMimeStream *filtered_stream, *ciphertext, *stream; + GMimePart *version_part, *encrypted_part; + GMimeContentType *content_type; + GMimeDataWrapper *wrapper; + GMimeFilter *crlf_filter; + const char *protocol; + + g_return_val_if_fail (GMIME_IS_MULTIPART_ENCRYPTED (mpe), -1); + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); + g_return_val_if_fail (GMIME_IS_OBJECT (content), -1); + + if (!(protocol = g_mime_crypto_context_get_encryption_protocol (ctx))) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("Encryption not supported.")); + return -1; + } + + /* get the cleartext */ + stream = g_mime_stream_mem_new (); + filtered_stream = g_mime_stream_filter_new (stream); + + crlf_filter = g_mime_filter_crlf_new (TRUE, FALSE); + g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), crlf_filter); + g_object_unref (crlf_filter); + + g_mime_object_write_to_stream (content, filtered_stream); + g_mime_stream_flush (filtered_stream); + g_object_unref (filtered_stream); + + /* reset the content stream */ + g_mime_stream_reset (stream); + + /* encrypt the content stream */ + ciphertext = g_mime_stream_mem_new (); + if (g_mime_crypto_context_encrypt (ctx, sign, userid, digest, recipients, stream, ciphertext, err) == -1) { + g_object_unref (ciphertext); + g_object_unref (stream); + return -1; + } + + g_object_unref (stream); + g_mime_stream_reset (ciphertext); + + /* construct the version part */ + content_type = g_mime_content_type_new_from_string (protocol); + version_part = g_mime_part_new_with_type (content_type->type, content_type->subtype); + g_object_unref (content_type); + + content_type = g_mime_content_type_new_from_string (protocol); + g_mime_object_set_content_type (GMIME_OBJECT (version_part), content_type); + g_mime_part_set_content_encoding (version_part, GMIME_CONTENT_ENCODING_7BIT); + stream = g_mime_stream_mem_new_with_buffer ("Version: 1\n", strlen ("Version: 1\n")); + wrapper = g_mime_data_wrapper_new_with_stream (stream, GMIME_CONTENT_ENCODING_7BIT); + g_mime_part_set_content_object (version_part, wrapper); + g_object_unref (wrapper); + g_object_unref (stream); + + /* construct the encrypted mime part */ + encrypted_part = g_mime_part_new_with_type ("application", "octet-stream"); + g_mime_part_set_content_encoding (encrypted_part, GMIME_CONTENT_ENCODING_7BIT); + wrapper = g_mime_data_wrapper_new_with_stream (ciphertext, GMIME_CONTENT_ENCODING_7BIT); + g_mime_part_set_content_object (encrypted_part, wrapper); + g_object_unref (ciphertext); + g_object_unref (wrapper); + + /* save the version and encrypted parts */ + /* FIXME: make sure there aren't any other parts?? */ + g_mime_multipart_add (GMIME_MULTIPART (mpe), GMIME_OBJECT (version_part)); + g_mime_multipart_add (GMIME_MULTIPART (mpe), GMIME_OBJECT (encrypted_part)); + g_object_unref (encrypted_part); + g_object_unref (version_part); + + /* set the content-type params for this multipart/encrypted part */ + g_mime_object_set_content_type_parameter (GMIME_OBJECT (mpe), "protocol", protocol); + g_mime_multipart_set_boundary (GMIME_MULTIPART (mpe), NULL); + + return 0; +} + + +static GMimeStream * +g_mime_data_wrapper_get_decoded_stream (GMimeDataWrapper *wrapper) +{ + GMimeStream *decoded_stream; + GMimeFilter *decoder; + + g_mime_stream_reset (wrapper->stream); + + switch (wrapper->encoding) { + case GMIME_CONTENT_ENCODING_BASE64: + case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: + case GMIME_CONTENT_ENCODING_UUENCODE: + decoder = g_mime_filter_basic_new (wrapper->encoding, FALSE); + decoded_stream = g_mime_stream_filter_new (wrapper->stream); + g_mime_stream_filter_add (GMIME_STREAM_FILTER (decoded_stream), decoder); + g_object_unref (decoder); + break; + default: + decoded_stream = wrapper->stream; + g_object_ref (wrapper->stream); + break; + } + + return decoded_stream; +} + + +/** + * g_mime_multipart_encrypted_decrypt: + * @mpe: multipart/encrypted object + * @ctx: decryption context + * @result: a #GMimeDecryptionResult + * @err: a #GError + * + * Attempts to decrypt the encrypted MIME part contained within the + * multipart/encrypted object @mpe using the @ctx decryption context. + * + * If @result is non-%NULL, then on a successful decrypt operation, it will be + * updated to point to a newly-allocated #GMimeDecryptResult with signature + * status information as well as a list of recipients that the part was + * encrypted to. + * + * Returns: the decrypted MIME part on success or %NULL on fail. If the + * decryption fails, an exception will be set on @err to provide + * information as to why the failure occured. + **/ +GMimeObject * +g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, GMimeCryptoContext *ctx, + GMimeDecryptResult **result, GError **err) +{ + GMimeObject *decrypted, *version, *encrypted; + GMimeStream *stream, *ciphertext; + const char *protocol, *supported; + GMimeStream *filtered_stream; + GMimeContentType *mime_type; + GMimeDataWrapper *wrapper; + GMimeFilter *crlf_filter; + GMimeDecryptResult *res; + GMimeParser *parser; + char *content_type; + + g_return_val_if_fail (GMIME_IS_MULTIPART_ENCRYPTED (mpe), NULL); + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + + if (result) + *result = NULL; + + protocol = g_mime_object_get_content_type_parameter (GMIME_OBJECT (mpe), "protocol"); + supported = g_mime_crypto_context_get_encryption_protocol (ctx); + + if (protocol) { + /* make sure the protocol matches the crypto encrypt protocol */ + if (!supported || g_ascii_strcasecmp (supported, protocol) != 0) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot decrypt multipart/encrypted part: unsupported encryption protocol '%s'."), + protocol); + + return NULL; + } + } else if (supported != NULL) { + /* *shrug* - I guess just go on as if they match? */ + protocol = supported; + } else { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot decrypt multipart/encrypted part: unspecified encryption protocol.")); + + return NULL; + } + + version = g_mime_multipart_get_part (GMIME_MULTIPART (mpe), GMIME_MULTIPART_ENCRYPTED_VERSION); + + /* make sure the protocol matches the version part's content-type */ + content_type = g_mime_content_type_to_string (version->content_type); + if (g_ascii_strcasecmp (content_type, protocol) != 0) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Cannot decrypt multipart/encrypted part: content-type does not match protocol.")); + + g_free (content_type); + + return NULL; + } + g_free (content_type); + + /* get the encrypted part and check that it is of type application/octet-stream */ + encrypted = g_mime_multipart_get_part (GMIME_MULTIPART (mpe), GMIME_MULTIPART_ENCRYPTED_CONTENT); + mime_type = g_mime_object_get_content_type (encrypted); + if (!g_mime_content_type_is_type (mime_type, "application", "octet-stream")) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Cannot decrypt multipart/encrypted part: unexpected content type.")); + + return NULL; + } + + /* get the ciphertext stream */ + wrapper = g_mime_part_get_content_object (GMIME_PART (encrypted)); + ciphertext = g_mime_data_wrapper_get_decoded_stream (wrapper); + g_mime_stream_reset (ciphertext); + + stream = g_mime_stream_mem_new (); + filtered_stream = g_mime_stream_filter_new (stream); + crlf_filter = g_mime_filter_crlf_new (FALSE, FALSE); + g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), crlf_filter); + g_object_unref (crlf_filter); + + /* get the cleartext */ + if (!(res = g_mime_crypto_context_decrypt (ctx, ciphertext, filtered_stream, err))) { + g_object_unref (filtered_stream); + g_object_unref (ciphertext); + g_object_unref (stream); + + return NULL; + } + + g_mime_stream_flush (filtered_stream); + g_object_unref (filtered_stream); + g_object_unref (ciphertext); + + g_mime_stream_reset (stream); + parser = g_mime_parser_new (); + g_mime_parser_init_with_stream (parser, stream); + g_object_unref (stream); + + decrypted = g_mime_parser_construct_part (parser); + g_object_unref (parser); + + if (!decrypted) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Cannot decrypt multipart/encrypted part: failed to parse decrypted content.")); + + g_object_unref (res); + + return NULL; + } + + if (!result) + g_object_unref (res); + else + *result = res; + + return decrypted; +} diff --git a/gmime/gmime-multipart-encrypted.h b/gmime/gmime-multipart-encrypted.h new file mode 100644 index 0000000..fb32615 --- /dev/null +++ b/gmime/gmime-multipart-encrypted.h @@ -0,0 +1,81 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_MULTIPART_ENCRYPTED_H__ +#define __GMIME_MULTIPART_ENCRYPTED_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_MULTIPART_ENCRYPTED (g_mime_multipart_encrypted_get_type ()) +#define GMIME_MULTIPART_ENCRYPTED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_MULTIPART_ENCRYPTED, GMimeMultipartEncrypted)) +#define GMIME_MULTIPART_ENCRYPTED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_MULTIPART_ENCRYPTED, GMimeMultipartEncryptedClass)) +#define GMIME_IS_MULTIPART_ENCRYPTED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_MULTIPART_ENCRYPTED)) +#define GMIME_IS_MULTIPART_ENCRYPTED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_MULTIPART_ENCRYPTED)) +#define GMIME_MULTIPART_ENCRYPTED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_MULTIPART_ENCRYPTED, GMimeMultipartEncryptedClass)) + +typedef struct _GMimeMultipartEncrypted GMimeMultipartEncrypted; +typedef struct _GMimeMultipartEncryptedClass GMimeMultipartEncryptedClass; + +enum { + GMIME_MULTIPART_ENCRYPTED_VERSION, + GMIME_MULTIPART_ENCRYPTED_CONTENT +}; + + +/** + * GMimeMultipartEncrypted: + * @parent_object: parent #GMimeMultipart + * @validity: a #GMimeSignatureValidity if the part has been decrypted or %NULL otherwise + * @decrypted: cached decrypted MIME part + * + * A multipart/encrypted MIME part. + **/ +struct _GMimeMultipartEncrypted { + GMimeMultipart parent_object; + +}; + +struct _GMimeMultipartEncryptedClass { + GMimeMultipartClass parent_class; + +}; + + +GType g_mime_multipart_encrypted_get_type (void); + +GMimeMultipartEncrypted *g_mime_multipart_encrypted_new (void); + +int g_mime_multipart_encrypted_encrypt (GMimeMultipartEncrypted *mpe, GMimeObject *content, + GMimeCryptoContext *ctx, gboolean sign, + const char *userid, GMimeDigestAlgo digest, + GPtrArray *recipients, GError **err); + +GMimeObject *g_mime_multipart_encrypted_decrypt (GMimeMultipartEncrypted *mpe, + GMimeCryptoContext *ctx, + GMimeDecryptResult **result, + GError **err); + +G_END_DECLS + +#endif /* __GMIME_MULTIPART_ENCRYPTED_H__ */ diff --git a/gmime/gmime-multipart-signed.c b/gmime/gmime-multipart-signed.c new file mode 100644 index 0000000..c6f2aa7 --- /dev/null +++ b/gmime/gmime-multipart-signed.c @@ -0,0 +1,473 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-multipart-signed.h" +#include "gmime-multipart-encrypted.h" +#include "gmime-message-part.h" +#include "gmime-stream-filter.h" +#include "gmime-filter-strip.h" +#include "gmime-filter-from.h" +#include "gmime-filter-crlf.h" +#include "gmime-stream-mem.h" +#include "gmime-parser.h" +#include "gmime-error.h" +#include "gmime-part.h" + +#ifdef ENABLE_DEBUG +#define d(x) x +#else +#define d(x) +#endif + +#define _(x) x + + +/** + * SECTION: gmime-multipart-signed + * @title: GMimeMultipartSigned + * @short_description: Signed MIME multiparts + * @see_also: #GMimeMultipart + * + * A #GMimeMultipartSigned part is a special subclass of + * #GMimeMultipart to make it easier to manipulate the + * multipart/signed MIME type. + **/ + + +/* GObject class methods */ +static void g_mime_multipart_signed_class_init (GMimeMultipartSignedClass *klass); +static void g_mime_multipart_signed_init (GMimeMultipartSigned *mps, GMimeMultipartSignedClass *klass); +static void g_mime_multipart_signed_finalize (GObject *object); + +/* GMimeObject class methods */ +static void multipart_signed_encode (GMimeObject *object, GMimeEncodingConstraint constraint); + + +static GMimeMultipartClass *parent_class = NULL; + + +GType +g_mime_multipart_signed_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeMultipartSignedClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_multipart_signed_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeMultipartSigned), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_multipart_signed_init, + }; + + type = g_type_register_static (GMIME_TYPE_MULTIPART, "GMimeMultipartSigned", &info, 0); + } + + return type; +} + + +static void +g_mime_multipart_signed_class_init (GMimeMultipartSignedClass *klass) +{ + GMimeObjectClass *object_class = GMIME_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_MULTIPART); + + gobject_class->finalize = g_mime_multipart_signed_finalize; + + object_class->encode = multipart_signed_encode; +} + +static void +g_mime_multipart_signed_init (GMimeMultipartSigned *mps, GMimeMultipartSignedClass *klass) +{ + +} + +static void +g_mime_multipart_signed_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +multipart_signed_encode (GMimeObject *object, GMimeEncodingConstraint constraint) +{ + /* Do NOT encode subparts of a multipart/signed */ + return; +} + + +/** + * g_mime_multipart_signed_new: + * + * Creates a new MIME multipart/signed object. + * + * Returns: an empty MIME multipart/signed object. + **/ +GMimeMultipartSigned * +g_mime_multipart_signed_new (void) +{ + GMimeMultipartSigned *multipart; + GMimeContentType *content_type; + + multipart = g_object_newv (GMIME_TYPE_MULTIPART_SIGNED, 0, NULL); + + content_type = g_mime_content_type_new ("multipart", "signed"); + g_mime_object_set_content_type (GMIME_OBJECT (multipart), content_type); + g_object_unref (content_type); + + return multipart; +} + + +/** + * sign_prepare: + * @mime_part: MIME part + * + * Prepare a part (and all subparts) to be signed. To do this we need + * to set the encoding of all parts (that are not already encoded to + * either QP or Base64) to QP. + **/ +static void +sign_prepare (GMimeObject *mime_part) +{ + GMimeContentEncoding encoding; + GMimeMultipart *multipart; + GMimeObject *subpart; + int i, n; + + if (GMIME_IS_MULTIPART (mime_part)) { + multipart = (GMimeMultipart *) mime_part; + + if (GMIME_IS_MULTIPART_SIGNED (multipart) || + GMIME_IS_MULTIPART_ENCRYPTED (multipart)) { + /* must not modify these parts as they must be treated as opaque */ + return; + } + + n = g_mime_multipart_get_count (multipart); + for (i = 0; i < n; i++) { + subpart = g_mime_multipart_get_part (multipart, i); + sign_prepare (subpart); + } + } else if (GMIME_IS_MESSAGE_PART (mime_part)) { + subpart = GMIME_MESSAGE_PART (mime_part)->message->mime_part; + sign_prepare (subpart); + } else { + encoding = g_mime_part_get_content_encoding (GMIME_PART (mime_part)); + + if (encoding != GMIME_CONTENT_ENCODING_BASE64) + g_mime_part_set_content_encoding (GMIME_PART (mime_part), + GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE); + } +} + + +/** + * g_mime_multipart_signed_sign: + * @mps: multipart/signed object + * @content: MIME part to sign + * @ctx: encryption crypto context + * @userid: user id to sign with + * @digest: preferred digest algorithm + * @err: exception + * + * Attempts to sign the @content MIME part with @userid's private key + * using the @ctx signing context with the @digest algorithm. If + * successful, the signed #GMimeObject is set as the signed part of + * the multipart/signed object @mps. + * + * Returns: %0 on success or %-1 on fail. If the signing fails, an + * exception will be set on @err to provide information as to why the + * failure occured. + **/ +int +g_mime_multipart_signed_sign (GMimeMultipartSigned *mps, GMimeObject *content, + GMimeCryptoContext *ctx, const char *userid, + GMimeDigestAlgo digest, GError **err) +{ + GMimeStream *stream, *filtered, *sigstream; + GMimeContentType *content_type; + GMimeDataWrapper *wrapper; + GMimePart *signature; + GMimeFilter *filter; + GMimeParser *parser; + const char *protocol; + const char *micalg; + int rv; + + g_return_val_if_fail (GMIME_IS_MULTIPART_SIGNED (mps), -1); + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), -1); + g_return_val_if_fail (GMIME_IS_OBJECT (content), -1); + + if (!(protocol = g_mime_crypto_context_get_signature_protocol (ctx))) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("Signing not supported.")); + return -1; + } + + /* Prepare all the parts for signing... */ + sign_prepare (content); + + /* get the cleartext */ + stream = g_mime_stream_mem_new (); + filtered = g_mime_stream_filter_new (stream); + + /* Note: see rfc3156, section 3 - second note */ + filter = g_mime_filter_from_new (GMIME_FILTER_FROM_MODE_ARMOR); + g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered), filter); + g_object_unref (filter); + + /* Note: see rfc3156, section 5.4 (this is the main difference between rfc2015 and rfc3156) */ + filter = g_mime_filter_strip_new (); + g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered), filter); + g_object_unref (filter); + + g_mime_object_write_to_stream (content, filtered); + g_mime_stream_flush (filtered); + g_object_unref (filtered); + g_mime_stream_reset (stream); + + /* Note: see rfc2015 or rfc3156, section 5.1 */ + filtered = g_mime_stream_filter_new (stream); + filter = g_mime_filter_crlf_new (TRUE, FALSE); + g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered), filter); + g_object_unref (filter); + + /* construct the signature stream */ + sigstream = g_mime_stream_mem_new (); + + /* sign the content stream */ + if ((rv = g_mime_crypto_context_sign (ctx, userid, digest, filtered, sigstream, err)) == -1) { + g_object_unref (sigstream); + g_object_unref (filtered); + g_object_unref (stream); + return -1; + } + + g_object_unref (filtered); + g_mime_stream_reset (sigstream); + g_mime_stream_reset (stream); + + /* set the multipart/signed protocol and micalg */ + content_type = g_mime_object_get_content_type (GMIME_OBJECT (mps)); + g_mime_content_type_set_parameter (content_type, "protocol", protocol); + micalg = g_strdup (g_mime_crypto_context_digest_name (ctx, (GMimeDigestAlgo) rv)); + g_mime_content_type_set_parameter (content_type, "micalg", micalg); + g_mime_multipart_set_boundary (GMIME_MULTIPART (mps), NULL); + + /* construct the content part */ + parser = g_mime_parser_new_with_stream (stream); + content = g_mime_parser_construct_part (parser); + g_object_unref (stream); + g_object_unref (parser); + + /* construct the signature part */ + content_type = g_mime_content_type_new_from_string (protocol); + signature = g_mime_part_new_with_type (content_type->type, content_type->subtype); + g_object_unref (content_type); + + wrapper = g_mime_data_wrapper_new (); + g_mime_data_wrapper_set_stream (wrapper, sigstream); + g_mime_part_set_content_object (signature, wrapper); + g_object_unref (sigstream); + g_object_unref (wrapper); + + /* FIXME: temporary hack, this info should probably be set in + * the CryptoContext class - maybe ::sign can take/output a + * GMimePart instead. */ + if (!g_ascii_strcasecmp (protocol, "application/pkcs7-signature")) { + g_mime_part_set_content_encoding (signature, GMIME_CONTENT_ENCODING_BASE64); + g_mime_part_set_filename (signature, "smime.p7m"); + } + + /* save the content and signature parts */ + /* FIXME: make sure there aren't any other parts?? */ + g_mime_multipart_add (GMIME_MULTIPART (mps), content); + g_mime_multipart_add (GMIME_MULTIPART (mps), (GMimeObject *) signature); + g_object_unref (signature); + g_object_unref (content); + + return 0; +} + +static gboolean +check_protocol_supported (const char *protocol, const char *supported) +{ + const char *subtype; + char *xsupported; + gboolean rv; + + if (!supported) + return FALSE; + + if (!g_ascii_strcasecmp (protocol, supported)) + return TRUE; + + if (!(subtype = strrchr (supported, '/'))) + return FALSE; + + subtype++; + + /* If the subtype already begins with "x-", then there's + * nothing else to check. */ + if (!g_ascii_strncasecmp (subtype, "x-", 2)) + return FALSE; + + /* Check if the "x-" version of the subtype matches the + * protocol. For example, if the supported protocol is + * "application/pkcs7-signature", then we also want to + * match "application/x-pkcs7-signature". */ + xsupported = g_strdup_printf ("%.*sx-%s", (int) (subtype - supported), supported, subtype); + rv = !g_ascii_strcasecmp (protocol, xsupported); + g_free (xsupported); + + return rv; +} + + +/** + * g_mime_multipart_signed_verify: + * @mps: multipart/signed object + * @ctx: encryption crypto context + * @err: exception + * + * Attempts to verify the signed MIME part contained within the + * multipart/signed object @mps using the @ctx crypto context. + * + * Returns: a new #GMimeSignatureList object on success or %NULL on fail. If + * the verification fails, an exception will be set on @err to provide + * information as to why the failure occured. + **/ +GMimeSignatureList * +g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, GMimeCryptoContext *ctx, + GError **err) +{ + const char *supported, *protocol, *micalg; + GMimeObject *content, *signature; + GMimeStream *stream, *sigstream; + GMimeSignatureList *signatures; + GMimeStream *filtered_stream; + GMimeDataWrapper *wrapper; + GMimeFilter *crlf_filter; + GMimeDigestAlgo digest; + char *content_type; + + g_return_val_if_fail (GMIME_IS_MULTIPART_SIGNED (mps), NULL); + g_return_val_if_fail (GMIME_IS_CRYPTO_CONTEXT (ctx), NULL); + + if (g_mime_multipart_get_count ((GMimeMultipart *) mps) < 2) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Cannot verify multipart/signed part due to missing subparts.")); + return NULL; + } + + protocol = g_mime_object_get_content_type_parameter (GMIME_OBJECT (mps), "protocol"); + micalg = g_mime_object_get_content_type_parameter (GMIME_OBJECT (mps), "micalg"); + + supported = g_mime_crypto_context_get_signature_protocol (ctx); + + if (protocol) { + /* make sure the protocol matches the crypto sign protocol */ + if (!check_protocol_supported (protocol, supported)) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot verify multipart/signed part: unsupported signature protocol '%s'."), + protocol); + return NULL; + } + } else if (supported != NULL) { + /* *shrug* - I guess just go on as if they match? */ + protocol = supported; + } else { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PROTOCOL_ERROR, + _("Cannot verify multipart/signed part: unspecified signature protocol.")); + + return NULL; + } + + signature = g_mime_multipart_get_part (GMIME_MULTIPART (mps), GMIME_MULTIPART_SIGNED_SIGNATURE); + + /* make sure the protocol matches the signature content-type */ + content_type = g_mime_content_type_to_string (signature->content_type); + if (g_ascii_strcasecmp (content_type, protocol) != 0) { + g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_PARSE_ERROR, + _("Cannot verify multipart/signed part: signature content-type does not match protocol.")); + g_free (content_type); + + return NULL; + } + g_free (content_type); + + content = g_mime_multipart_get_part (GMIME_MULTIPART (mps), GMIME_MULTIPART_SIGNED_CONTENT); + + /* get the content stream */ + stream = g_mime_stream_mem_new (); + filtered_stream = g_mime_stream_filter_new (stream); + + /* Note: see rfc2015 or rfc3156, section 5.1 */ + crlf_filter = g_mime_filter_crlf_new (TRUE, FALSE); + g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), crlf_filter); + g_object_unref (crlf_filter); + + g_mime_object_write_to_stream (content, filtered_stream); + g_mime_stream_flush (filtered_stream); + g_object_unref (filtered_stream); + g_mime_stream_reset (stream); + + /* get the signature stream */ + wrapper = g_mime_part_get_content_object (GMIME_PART (signature)); + + /* FIXME: temporary hack for Balsa to support S/MIME, + * ::verify() should probably take a mime part so it can + * decode this itself if it needs to. */ + if (!g_ascii_strcasecmp (protocol, "application/pkcs7-signature") || + !g_ascii_strcasecmp (protocol, "application/x-pkcs7-signature")) { + sigstream = g_mime_stream_mem_new (); + g_mime_data_wrapper_write_to_stream (wrapper, sigstream); + } else { + sigstream = g_mime_data_wrapper_get_stream (wrapper); + } + + g_mime_stream_reset (sigstream); + + /* verify the signature */ + digest = g_mime_crypto_context_digest_id (ctx, micalg); + signatures = g_mime_crypto_context_verify (ctx, digest, stream, sigstream, err); + + d(printf ("attempted to verify:\n----- BEGIN SIGNED PART -----\n%.*s----- END SIGNED PART -----\n", + (int) GMIME_STREAM_MEM (stream)->buffer->len, GMIME_STREAM_MEM (stream)->buffer->data)); + + g_object_unref (stream); + + return signatures; +} diff --git a/gmime/gmime-multipart-signed.h b/gmime/gmime-multipart-signed.h new file mode 100644 index 0000000..f0faf19 --- /dev/null +++ b/gmime/gmime-multipart-signed.h @@ -0,0 +1,77 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_MULTIPART_SIGNED_H__ +#define __GMIME_MULTIPART_SIGNED_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_MULTIPART_SIGNED (g_mime_multipart_signed_get_type ()) +#define GMIME_MULTIPART_SIGNED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_MULTIPART_SIGNED, GMimeMultipartSigned)) +#define GMIME_MULTIPART_SIGNED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_MULTIPART_SIGNED, GMimeMultipartSignedClass)) +#define GMIME_IS_MULTIPART_SIGNED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_MULTIPART_SIGNED)) +#define GMIME_IS_MULTIPART_SIGNED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_MULTIPART_SIGNED)) +#define GMIME_MULTIPART_SIGNED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_MULTIPART_SIGNED, GMimeMultipartSignedClass)) + +typedef struct _GMimeMultipartSigned GMimeMultipartSigned; +typedef struct _GMimeMultipartSignedClass GMimeMultipartSignedClass; + +enum { + GMIME_MULTIPART_SIGNED_CONTENT, + GMIME_MULTIPART_SIGNED_SIGNATURE +}; + + +/** + * GMimeMultipartSigned: + * @parent_object: parent #GMimeMultipart + * + * A multipart/signed MIME part. + **/ +struct _GMimeMultipartSigned { + GMimeMultipart parent_object; + +}; + +struct _GMimeMultipartSignedClass { + GMimeMultipartClass parent_class; + +}; + + +GType g_mime_multipart_signed_get_type (void); + +GMimeMultipartSigned *g_mime_multipart_signed_new (void); + +int g_mime_multipart_signed_sign (GMimeMultipartSigned *mps, GMimeObject *content, + GMimeCryptoContext *ctx, const char *userid, + GMimeDigestAlgo digest, GError **err); + +GMimeSignatureList *g_mime_multipart_signed_verify (GMimeMultipartSigned *mps, + GMimeCryptoContext *ctx, + GError **err); + +G_END_DECLS + +#endif /* __GMIME_MULTIPART_SIGNED_H__ */ diff --git a/gmime/gmime-multipart.c b/gmime/gmime-multipart.c new file mode 100644 index 0000000..8513062 --- /dev/null +++ b/gmime/gmime-multipart.c @@ -0,0 +1,870 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gmime-multipart.h" +#include "gmime-utils.h" + + +#define d(x) + + +/** + * SECTION: gmime-multipart + * @title: GMimeMultipart + * @short_description: MIME multiparts + * @see_also: + * + * A #GMimeMultipart represents all multipart MIME container parts. + **/ + + +/* GObject class methods */ +static void g_mime_multipart_class_init (GMimeMultipartClass *klass); +static void g_mime_multipart_init (GMimeMultipart *multipart, GMimeMultipartClass *klass); +static void g_mime_multipart_finalize (GObject *object); + +/* GMimeObject class methods */ +static ssize_t multipart_write_to_stream (GMimeObject *object, GMimeStream *stream); +static void multipart_encode (GMimeObject *object, GMimeEncodingConstraint constraint); + +/* GMimeMultipart class methods */ +static void multipart_clear (GMimeMultipart *multipart); +static void multipart_add (GMimeMultipart *multipart, GMimeObject *part); +static void multipart_insert (GMimeMultipart *multipart, int index, GMimeObject *part); +static gboolean multipart_remove (GMimeMultipart *multipart, GMimeObject *part); +static GMimeObject *multipart_remove_at (GMimeMultipart *multipart, int index); +static GMimeObject *multipart_get_part (GMimeMultipart *multipart, int index); +static gboolean multipart_contains (GMimeMultipart *multipart, GMimeObject *part); +static int multipart_index_of (GMimeMultipart *multipart, GMimeObject *part); +static int multipart_get_count (GMimeMultipart *multipart); +static void multipart_set_boundary (GMimeMultipart *multipart, const char *boundary); +static const char *multipart_get_boundary (GMimeMultipart *multipart); + + +static GMimeObjectClass *parent_class = NULL; + + +GType +g_mime_multipart_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeMultipartClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_multipart_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeMultipart), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_multipart_init, + }; + + type = g_type_register_static (GMIME_TYPE_OBJECT, "GMimeMultipart", &info, 0); + } + + return type; +} + + +static void +g_mime_multipart_class_init (GMimeMultipartClass *klass) +{ + GMimeObjectClass *object_class = GMIME_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_OBJECT); + + gobject_class->finalize = g_mime_multipart_finalize; + + object_class->write_to_stream = multipart_write_to_stream; + object_class->encode = multipart_encode; + + klass->add = multipart_add; + klass->clear = multipart_clear; + klass->insert = multipart_insert; + klass->remove = multipart_remove; + klass->remove_at = multipart_remove_at; + klass->get_part = multipart_get_part; + klass->contains = multipart_contains; + klass->index_of = multipart_index_of; + klass->get_count = multipart_get_count; + klass->set_boundary = multipart_set_boundary; + klass->get_boundary = multipart_get_boundary; +} + +static void +g_mime_multipart_init (GMimeMultipart *multipart, GMimeMultipartClass *klass) +{ + multipart->children = g_ptr_array_new (); + multipart->preface = NULL; + multipart->postface = NULL; +} + +static void +g_mime_multipart_finalize (GObject *object) +{ + GMimeMultipart *multipart = (GMimeMultipart *) object; + guint i; + + g_free (multipart->preface); + g_free (multipart->postface); + + for (i = 0; i < multipart->children->len; i++) + g_object_unref (multipart->children->pdata[i]); + + g_ptr_array_free (multipart->children, TRUE); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static ssize_t +multipart_write_to_stream (GMimeObject *object, GMimeStream *stream) +{ + GMimeMultipart *multipart = (GMimeMultipart *) object; + ssize_t nwritten, total = 0; + const char *boundary; + GMimeObject *part; + guint i; + + /* make sure a boundary is set unless we are writing out a raw + * header (in which case it should already be set... or if + * not, then it's a broken multipart and so we don't want to + * alter it or we'll completely break the output) */ + boundary = g_mime_object_get_content_type_parameter (object, "boundary"); + if (!boundary && !g_mime_header_list_get_stream (object->headers)) { + g_mime_multipart_set_boundary (multipart, NULL); + boundary = g_mime_object_get_content_type_parameter (object, "boundary"); + } + + /* write the content headers */ + if ((nwritten = g_mime_header_list_write_to_stream (object->headers, stream)) == -1) + return -1; + + total += nwritten; + + /* write the preface */ + if (multipart->preface) { + /* terminate the headers */ + if (g_mime_stream_write (stream, "\n", 1) == -1) + return -1; + + total++; + + if ((nwritten = g_mime_stream_write_string (stream, multipart->preface)) == -1) + return -1; + + total += nwritten; + } + + for (i = 0; i < multipart->children->len; i++) { + part = multipart->children->pdata[i]; + + /* write the boundary */ + if ((nwritten = g_mime_stream_printf (stream, "\n--%s\n", boundary)) == -1) + return -1; + + total += nwritten; + + /* write this part out */ + if ((nwritten = g_mime_object_write_to_stream (part, stream)) == -1) + return -1; + + total += nwritten; + } + + /* write the end-boundary (but only if a boundary is set) */ + if (boundary) { + if ((nwritten = g_mime_stream_printf (stream, "\n--%s--\n", boundary)) == -1) + return -1; + + total += nwritten; + } + + /* write the postface */ + if (multipart->postface) { + if ((nwritten = g_mime_stream_write_string (stream, multipart->postface)) == -1) + return -1; + + total += nwritten; + } + + return total; +} + +static void +multipart_encode (GMimeObject *object, GMimeEncodingConstraint constraint) +{ + GMimeMultipart *multipart = (GMimeMultipart *) object; + GMimeObject *subpart; + int i; + + for (i = 0; i < g_mime_multipart_get_count (multipart); i++) { + subpart = g_mime_multipart_get_part (multipart, i); + g_mime_object_encode (subpart, constraint); + } +} + + +/** + * g_mime_multipart_new: + * + * Creates a new MIME multipart object with a default content-type of + * multipart/mixed. + * + * Returns: an empty MIME multipart object with a default content-type of + * multipart/mixed. + **/ +GMimeMultipart * +g_mime_multipart_new (void) +{ + GMimeContentType *content_type; + GMimeMultipart *multipart; + + multipart = g_object_newv (GMIME_TYPE_MULTIPART, 0, NULL); + + content_type = g_mime_content_type_new ("multipart", "mixed"); + g_mime_object_set_content_type (GMIME_OBJECT (multipart), content_type); + g_object_unref (content_type); + + return multipart; +} + + +/** + * g_mime_multipart_new_with_subtype: + * @subtype: content-type subtype + * + * Creates a new MIME multipart object with a content-type of + * multipart/@subtype. + * + * Returns: an empty MIME multipart object with a content-type of + * multipart/@subtype. + **/ +GMimeMultipart * +g_mime_multipart_new_with_subtype (const char *subtype) +{ + GMimeContentType *content_type; + GMimeMultipart *multipart; + + multipart = g_object_newv (GMIME_TYPE_MULTIPART, 0, NULL); + + content_type = g_mime_content_type_new ("multipart", subtype ? subtype : "mixed"); + g_mime_object_set_content_type (GMIME_OBJECT (multipart), content_type); + g_object_unref (content_type); + + return multipart; +} + + +/** + * g_mime_multipart_set_preface: + * @multipart: a #GMimeMultipart object + * @preface: preface + * + * Sets the preface on the multipart. + **/ +void +g_mime_multipart_set_preface (GMimeMultipart *multipart, const char *preface) +{ + g_return_if_fail (GMIME_IS_MULTIPART (multipart)); + + g_free (multipart->preface); + multipart->preface = g_strdup (preface); +} + + +/** + * g_mime_multipart_get_preface: + * @multipart: a #GMimeMultipart object + * + * Gets the preface on the multipart. + * + * Returns: a pointer to the preface string on the multipart. + **/ +const char * +g_mime_multipart_get_preface (GMimeMultipart *multipart) +{ + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), NULL); + + return multipart->preface; +} + + +/** + * g_mime_multipart_set_postface: + * @multipart: a #GMimeMultipart object + * @postface: postface + * + * Sets the postface on the multipart. + **/ +void +g_mime_multipart_set_postface (GMimeMultipart *multipart, const char *postface) +{ + g_return_if_fail (GMIME_IS_MULTIPART (multipart)); + + g_free (multipart->postface); + multipart->postface = g_strdup (postface); +} + + +/** + * g_mime_multipart_get_postface: + * @multipart: a #GMimeMultipart object + * + * Gets the postface on the multipart. + * + * Returns: a pointer to the postface string on the multipart. + **/ +const char * +g_mime_multipart_get_postface (GMimeMultipart *multipart) +{ + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), NULL); + + return multipart->postface; +} + + +static void +multipart_clear (GMimeMultipart *multipart) +{ + guint i; + + for (i = 0; i < multipart->children->len; i++) + g_object_unref (multipart->children->pdata[i]); + + g_ptr_array_set_size (multipart->children, 0); +} + + +/** + * g_mime_multipart_clear: + * @multipart: a #GMimeMultipart object + * + * Removes all subparts from @multipart. + **/ +void +g_mime_multipart_clear (GMimeMultipart *multipart) +{ + g_return_if_fail (GMIME_IS_MULTIPART (multipart)); + + GMIME_MULTIPART_GET_CLASS (multipart)->clear (multipart); +} + + +static void +multipart_add (GMimeMultipart *multipart, GMimeObject *part) +{ + g_ptr_array_add (multipart->children, part); + g_object_ref (part); +} + + +/** + * g_mime_multipart_add: + * @multipart: a #GMimeMultipart object + * @part: a #GMimeObject + * + * Adds a mime part to the multipart. + **/ +void +g_mime_multipart_add (GMimeMultipart *multipart, GMimeObject *part) +{ + g_return_if_fail (GMIME_IS_MULTIPART (multipart)); + g_return_if_fail (GMIME_IS_OBJECT (part)); + + GMIME_MULTIPART_GET_CLASS (multipart)->add (multipart, part); +} + + +static void +ptr_array_insert (GPtrArray *array, guint index, gpointer object) +{ + unsigned char *dest, *src; + guint n; + + if (index < array->len) { + /* need to shift some items */ + g_ptr_array_set_size (array, array->len + 1); + + dest = ((unsigned char *) array->pdata) + (sizeof (void *) * (index + 1)); + src = ((unsigned char *) array->pdata) + (sizeof (void *) * index); + n = array->len - index - 1; + + g_memmove (dest, src, (sizeof (void *) * n)); + array->pdata[index] = object; + } else { + /* the easy case */ + g_ptr_array_add (array, object); + } +} + +static void +multipart_insert (GMimeMultipart *multipart, int index, GMimeObject *part) +{ + ptr_array_insert (multipart->children, index, part); + g_object_ref (part); +} + + +/** + * g_mime_multipart_insert: + * @multipart: a #GMimeMultipart object + * @part: mime part + * @index: position to insert the mime part + * + * Inserts the specified mime part into the multipart at the position + * @index. + **/ +void +g_mime_multipart_insert (GMimeMultipart *multipart, int index, GMimeObject *part) +{ + g_return_if_fail (GMIME_IS_MULTIPART (multipart)); + g_return_if_fail (GMIME_IS_OBJECT (part)); + g_return_if_fail (index >= 0); + + GMIME_MULTIPART_GET_CLASS (multipart)->insert (multipart, index, part); +} + + +static gboolean +multipart_remove (GMimeMultipart *multipart, GMimeObject *part) +{ + if (!g_ptr_array_remove (multipart->children, part)) + return FALSE; + + g_object_unref (part); + + return TRUE; +} + + +/** + * g_mime_multipart_remove: + * @multipart: a #GMimeMultipart object + * @part: mime part + * + * Removes the specified mime part from the multipart. + * + * Returns: %TRUE if the part was removed or %FALSE otherwise. + **/ +gboolean +g_mime_multipart_remove (GMimeMultipart *multipart, GMimeObject *part) +{ + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), FALSE); + g_return_val_if_fail (GMIME_IS_OBJECT (part), FALSE); + + return GMIME_MULTIPART_GET_CLASS (multipart)->remove (multipart, part); +} + + +static GMimeObject * +multipart_remove_at (GMimeMultipart *multipart, int index) +{ + GMimeObject *part; + + if ((guint) index >= multipart->children->len) + return NULL; + + part = multipart->children->pdata[index]; + + g_ptr_array_remove_index (multipart->children, index); + + return part; +} + + +/** + * g_mime_multipart_remove_at: + * @multipart: a #GMimeMultipart object + * @index: position of the mime part to remove + * + * Removes the mime part at position @index from the multipart. + * + * Returns: the mime part that was removed or %NULL if the part was + * not contained within the multipart. + **/ +GMimeObject * +g_mime_multipart_remove_at (GMimeMultipart *multipart, int index) +{ + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), NULL); + g_return_val_if_fail (index >= 0, NULL); + + return GMIME_MULTIPART_GET_CLASS (multipart)->remove_at (multipart, index); +} + + +/** + * g_mime_multipart_replace: + * @multipart: a #GMimeMultipart object + * @index: position of the mime part to replace + * @replacement: a #GMimeObject to use as the replacement + * + * Replaces the mime part at position @index within @multipart with + * @replacement. + * + * Returns: the mime part that was replaced or %NULL if the part was + * not contained within the multipart. + **/ +GMimeObject * +g_mime_multipart_replace (GMimeMultipart *multipart, int index, GMimeObject *replacement) +{ + GMimeObject *replaced; + + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), NULL); + g_return_val_if_fail (GMIME_IS_OBJECT (replacement), NULL); + g_return_val_if_fail (index >= 0, NULL); + + if ((guint) index >= multipart->children->len) + return NULL; + + replaced = multipart->children->pdata[index]; + multipart->children->pdata[index] = replacement; + g_object_ref (replacement); + + return replaced; +} + + +static GMimeObject * +multipart_get_part (GMimeMultipart *multipart, int index) +{ + GMimeObject *part; + + if ((guint) index >= multipart->children->len) + return NULL; + + part = multipart->children->pdata[index]; + + return part; +} + + +/** + * g_mime_multipart_get_part: + * @multipart: a #GMimeMultipart object + * @index: position of the mime part + * + * Gets the mime part at position @index within the multipart. + * + * Returns: the mime part at position @index. + **/ +GMimeObject * +g_mime_multipart_get_part (GMimeMultipart *multipart, int index) +{ + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), NULL); + g_return_val_if_fail (index >= 0, NULL); + + return GMIME_MULTIPART_GET_CLASS (multipart)->get_part (multipart, index); +} + + +static gboolean +multipart_contains (GMimeMultipart *multipart, GMimeObject *part) +{ + guint i; + + for (i = 0; i < multipart->children->len; i++) { + if (part == (GMimeObject *) multipart->children->pdata[i]) + return TRUE; + } + + return FALSE; +} + + +/** + * g_mime_multipart_contains: + * @multipart: a #GMimeMultipart object + * @part: mime part + * + * Checks if @part is contained within @multipart. + * + * Returns: %TRUE if @part is a subpart of @multipart or %FALSE + * otherwise. + **/ +gboolean +g_mime_multipart_contains (GMimeMultipart *multipart, GMimeObject *part) +{ + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), FALSE); + g_return_val_if_fail (GMIME_IS_OBJECT (part), FALSE); + + return GMIME_MULTIPART_GET_CLASS (multipart)->contains (multipart, part); +} + + +static int +multipart_index_of (GMimeMultipart *multipart, GMimeObject *part) +{ + guint i; + + for (i = 0; i < multipart->children->len; i++) { + if (part == (GMimeObject *) multipart->children->pdata[i]) + return i; + } + + return -1; +} + + +/** + * g_mime_multipart_index_of: + * @multipart: a #GMimeMultipart object + * @part: mime part + * + * Gets the index of @part within @multipart. + * + * Returns: the index of @part within @multipart or %-1 if not found. + **/ +int +g_mime_multipart_index_of (GMimeMultipart *multipart, GMimeObject *part) +{ + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), -1); + g_return_val_if_fail (GMIME_IS_OBJECT (part), -1); + + return GMIME_MULTIPART_GET_CLASS (multipart)->index_of (multipart, part); +} + + +static int +multipart_get_count (GMimeMultipart *multipart) +{ + return multipart->children->len; +} + + +/** + * g_mime_multipart_get_count: + * @multipart: a #GMimeMultipart object + * + * Gets the number of mime parts contained within the multipart. + * + * Returns: the number of mime parts contained within the multipart. + **/ +int +g_mime_multipart_get_count (GMimeMultipart *multipart) +{ + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), -1); + + return GMIME_MULTIPART_GET_CLASS (multipart)->get_count (multipart); +} + + +static void +read_random_pool (unsigned char *buffer, size_t bytes) +{ +#ifdef __unix__ + size_t nread = 0; + ssize_t n; + int fd; + + if ((fd = open ("/dev/urandom", O_RDONLY)) == -1) { + if ((fd = open ("/dev/random", O_RDONLY)) == -1) + return; + } + + do { + do { + n = read (fd, (char *) buffer + nread, bytes - nread); + } while (n == -1 && errno == EINTR); + + if (n == -1 || n == 0) + break; + + nread += n; + } while (nread < bytes); + + close (fd); +#else + size_t i; + + srand ((unsigned int) time (NULL)); + + for (i = 0; i < bytes; i++) + buffer[i] = (unsigned char) (rand () % 256); +#endif +} + +static void +multipart_set_boundary (GMimeMultipart *multipart, const char *boundary) +{ + char bbuf[35]; + + if (!boundary) { + /* Generate a fairly random boundary string. */ + unsigned char digest[16], *p; + guint32 save = 0; + int state = 0; + + read_random_pool (digest, 16); + + strcpy (bbuf, "=-"); + p = (unsigned char *) bbuf + 2; + p += g_mime_encoding_base64_encode_step (digest, 16, p, &state, &save); + *p = '\0'; + + boundary = bbuf; + } + + g_mime_object_set_content_type_parameter (GMIME_OBJECT (multipart), "boundary", boundary); +} + + +/** + * g_mime_multipart_set_boundary: + * @multipart: a #GMimeMultipart object + * @boundary: boundary or %NULL to autogenerate one + * + * Sets @boundary as the boundary on the multipart. If @boundary is + * %NULL, then a boundary will be auto-generated for you. + **/ +void +g_mime_multipart_set_boundary (GMimeMultipart *multipart, const char *boundary) +{ + g_return_if_fail (GMIME_IS_MULTIPART (multipart)); + + GMIME_MULTIPART_GET_CLASS (multipart)->set_boundary (multipart, boundary); +} + + +static const char * +multipart_get_boundary (GMimeMultipart *multipart) +{ + GMimeObject *object = (GMimeObject *) multipart; + const char *boundary; + + if ((boundary = g_mime_object_get_content_type_parameter (object, "boundary"))) + return boundary; + + multipart_set_boundary (multipart, NULL); + + return g_mime_object_get_content_type_parameter (object, "boundary"); +} + + +/** + * g_mime_multipart_get_boundary: + * @multipart: a #GMimeMultipart object + * + * Gets the boundary on the multipart. If the internal boundary is + * %NULL, then an auto-generated boundary will be set on the multipart + * and returned. + * + * Returns: the boundary on the multipart. + **/ +const char * +g_mime_multipart_get_boundary (GMimeMultipart *multipart) +{ + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), NULL); + + return GMIME_MULTIPART_GET_CLASS (multipart)->get_boundary (multipart); +} + + +static void +multipart_foreach (GMimeMultipart *multipart, GMimeObjectForeachFunc callback, gpointer user_data) +{ + GMimeObject *part; + guint i; + + for (i = 0; i < multipart->children->len; i++) { + part = (GMimeObject *) multipart->children->pdata[i]; + callback ((GMimeObject *) multipart, part, user_data); + + if (GMIME_IS_MULTIPART (part)) + multipart_foreach ((GMimeMultipart *) part, callback, user_data); + } +} + + +/** + * g_mime_multipart_foreach: + * @multipart: a #GMimeMultipart + * @callback: function to call for each of @multipart's subparts. + * @user_data: user-supplied callback data + * + * Recursively calls @callback on each of @multipart's subparts. + **/ +void +g_mime_multipart_foreach (GMimeMultipart *multipart, GMimeObjectForeachFunc callback, gpointer user_data) +{ + g_return_if_fail (GMIME_IS_MULTIPART (multipart)); + g_return_if_fail (callback != NULL); + + multipart_foreach (multipart, callback, user_data); +} + + +/** + * g_mime_multipart_get_subpart_from_content_id: + * @multipart: a multipart + * @content_id: the content id of the part to look for + * + * Gets the mime part with the content-id @content_id from the + * multipart @multipart. + * + * Returns: the #GMimeObject whose content-id matches the search string, + * or %NULL if a match cannot be found. + **/ +GMimeObject * +g_mime_multipart_get_subpart_from_content_id (GMimeMultipart *multipart, const char *content_id) +{ + GMimeObject *object = (GMimeObject *) multipart; + GMimeObject *subpart, *part; + GMimeMultipart *mpart; + guint i; + + g_return_val_if_fail (GMIME_IS_MULTIPART (multipart), NULL); + g_return_val_if_fail (content_id != NULL, NULL); + + if (object->content_id && !strcmp (object->content_id, content_id)) + return object; + + for (i = 0; i < multipart->children->len; i++) { + subpart = multipart->children->pdata[i]; + + if (subpart->content_id && !strcmp (subpart->content_id, content_id)) + return subpart; + + if (GMIME_IS_MULTIPART (subpart)) { + mpart = (GMimeMultipart *) subpart; + if ((part = g_mime_multipart_get_subpart_from_content_id (mpart, content_id))) + return part; + } + } + + return NULL; +} diff --git a/gmime/gmime-multipart.h b/gmime/gmime-multipart.h new file mode 100644 index 0000000..6e7f577 --- /dev/null +++ b/gmime/gmime-multipart.h @@ -0,0 +1,120 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_MULTIPART_H__ +#define __GMIME_MULTIPART_H__ + +#include + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_MULTIPART (g_mime_multipart_get_type ()) +#define GMIME_MULTIPART(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_MULTIPART, GMimeMultipart)) +#define GMIME_MULTIPART_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_MULTIPART, GMimeMultipartClass)) +#define GMIME_IS_MULTIPART(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_MULTIPART)) +#define GMIME_IS_MULTIPART_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_MULTIPART)) +#define GMIME_MULTIPART_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_MULTIPART, GMimeMultipartClass)) + +typedef struct _GMimeMultipart GMimeMultipart; +typedef struct _GMimeMultipartClass GMimeMultipartClass; + +/** + * GMimeMultipart: + * @parent_object: parent #GMimeObject + * @children: array of MIME sub-parts + * @boundary: MIME boundary + * @preface: multipart preface + * @postface: multipart postface + * + * A base MIME multipart object. + **/ +struct _GMimeMultipart { + GMimeObject parent_object; + + GPtrArray *children; + char *boundary; + char *preface; + char *postface; +}; + +struct _GMimeMultipartClass { + GMimeObjectClass parent_class; + + void (* clear) (GMimeMultipart *multipart); + void (* add) (GMimeMultipart *multipart, GMimeObject *part); + void (* insert) (GMimeMultipart *multipart, int index, GMimeObject *part); + gboolean (* remove) (GMimeMultipart *multipart, GMimeObject *part); + GMimeObject * (* remove_at) (GMimeMultipart *multipart, int index); + GMimeObject * (* get_part) (GMimeMultipart *multipart, int index); + + gboolean (* contains) (GMimeMultipart *multipart, GMimeObject *part); + int (* index_of) (GMimeMultipart *multipart, GMimeObject *part); + + int (* get_count) (GMimeMultipart *multipart); + + void (* set_boundary) (GMimeMultipart *multipart, const char *boundary); + const char * (* get_boundary) (GMimeMultipart *multipart); +}; + + +GType g_mime_multipart_get_type (void); + +GMimeMultipart *g_mime_multipart_new (void); + +GMimeMultipart *g_mime_multipart_new_with_subtype (const char *subtype); + +void g_mime_multipart_set_preface (GMimeMultipart *multipart, const char *preface); +const char *g_mime_multipart_get_preface (GMimeMultipart *multipart); + +void g_mime_multipart_set_postface (GMimeMultipart *multipart, const char *postface); +const char *g_mime_multipart_get_postface (GMimeMultipart *multipart); + +void g_mime_multipart_clear (GMimeMultipart *multipart); + +void g_mime_multipart_add (GMimeMultipart *multipart, GMimeObject *part); +void g_mime_multipart_insert (GMimeMultipart *multipart, int index, GMimeObject *part); +gboolean g_mime_multipart_remove (GMimeMultipart *multipart, GMimeObject *part); +GMimeObject *g_mime_multipart_remove_at (GMimeMultipart *multipart, int index); +GMimeObject *g_mime_multipart_replace (GMimeMultipart *multipart, int index, GMimeObject *replacement); +GMimeObject *g_mime_multipart_get_part (GMimeMultipart *multipart, int index); + +gboolean g_mime_multipart_contains (GMimeMultipart *multipart, GMimeObject *part); +int g_mime_multipart_index_of (GMimeMultipart *multipart, GMimeObject *part); + +int g_mime_multipart_get_count (GMimeMultipart *multipart); + +void g_mime_multipart_set_boundary (GMimeMultipart *multipart, const char *boundary); +const char *g_mime_multipart_get_boundary (GMimeMultipart *multipart); + +/* convenience functions */ + +void g_mime_multipart_foreach (GMimeMultipart *multipart, GMimeObjectForeachFunc callback, + gpointer user_data); + +GMimeObject *g_mime_multipart_get_subpart_from_content_id (GMimeMultipart *multipart, + const char *content_id); + +G_END_DECLS + +#endif /* __GMIME_MULTIPART_H__ */ diff --git a/gmime/gmime-object.c b/gmime/gmime-object.c new file mode 100644 index 0000000..3b0ffc3 --- /dev/null +++ b/gmime/gmime-object.c @@ -0,0 +1,1089 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gmime-common.h" +#include "gmime-object.h" +#include "gmime-stream-mem.h" +#include "gmime-events.h" +#include "gmime-utils.h" + + +/** + * SECTION: gmime-object + * @title: GMimeObject + * @short_description: Abstract MIME objects + * @see_also: + * + * #GMimeObject is an abstract class from which all message and MIME + * parts are derived. + **/ + + +struct _type_bucket { + char *type; + GType object_type; + GHashTable *subtype_hash; +}; + +struct _subtype_bucket { + char *subtype; + GType object_type; +}; + +static void _g_mime_object_set_content_disposition (GMimeObject *object, GMimeContentDisposition *disposition); +void _g_mime_object_set_content_type (GMimeObject *object, GMimeContentType *content_type); + +static void g_mime_object_class_init (GMimeObjectClass *klass); +static void g_mime_object_init (GMimeObject *object, GMimeObjectClass *klass); +static void g_mime_object_finalize (GObject *object); + +static void object_prepend_header (GMimeObject *object, const char *name, const char *value); +static void object_append_header (GMimeObject *object, const char *name, const char *value); +static void object_set_header (GMimeObject *object, const char *name, const char *value); +static const char *object_get_header (GMimeObject *object, const char *name); +static gboolean object_remove_header (GMimeObject *object, const char *name); +static void object_set_content_type (GMimeObject *object, GMimeContentType *content_type); +static char *object_get_headers (GMimeObject *object); +static ssize_t object_write_to_stream (GMimeObject *object, GMimeStream *stream); +static void object_encode (GMimeObject *object, GMimeEncodingConstraint constraint); + +static ssize_t write_content_type (GMimeStream *stream, const char *name, const char *value); +static ssize_t write_disposition (GMimeStream *stream, const char *name, const char *value); + +static void content_type_changed (GMimeContentType *content_type, gpointer args, GMimeObject *object); +static void content_disposition_changed (GMimeContentDisposition *disposition, gpointer args, GMimeObject *object); + + +static GHashTable *type_hash = NULL; + +static GObjectClass *parent_class = NULL; + + +GType +g_mime_object_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeObjectClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_object_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeObject), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_object_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeObject", + &info, G_TYPE_FLAG_ABSTRACT); + } + + return type; +} + + +static void +g_mime_object_class_init (GMimeObjectClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_object_finalize; + + klass->prepend_header = object_prepend_header; + klass->append_header = object_append_header; + klass->remove_header = object_remove_header; + klass->set_header = object_set_header; + klass->get_header = object_get_header; + klass->set_content_type = object_set_content_type; + klass->get_headers = object_get_headers; + klass->write_to_stream = object_write_to_stream; + klass->encode = object_encode; +} + +static void +g_mime_object_init (GMimeObject *object, GMimeObjectClass *klass) +{ + object->headers = g_mime_header_list_new (); + object->content_type = NULL; + object->disposition = NULL; + object->content_id = NULL; + + g_mime_header_list_register_writer (object->headers, "Content-Type", write_content_type); + g_mime_header_list_register_writer (object->headers, "Content-Disposition", write_disposition); +} + +static void +g_mime_object_finalize (GObject *object) +{ + GMimeObject *mime = (GMimeObject *) object; + + if (mime->content_type) { + g_mime_event_remove (mime->content_type->priv, (GMimeEventCallback) content_type_changed, object); + g_object_unref (mime->content_type); + } + + if (mime->disposition) { + g_mime_event_remove (mime->disposition->priv, (GMimeEventCallback) content_disposition_changed, object); + g_object_unref (mime->disposition); + } + + if (mime->headers) + g_mime_header_list_destroy (mime->headers); + + g_free (mime->content_id); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static ssize_t +write_content_type (GMimeStream *stream, const char *name, const char *value) +{ + GMimeContentType *content_type; + ssize_t nwritten; + GString *out; + char *val; + + out = g_string_new (""); + g_string_printf (out, "%s: ", name); + + content_type = g_mime_content_type_new_from_string (value); + + val = g_mime_content_type_to_string (content_type); + g_string_append (out, val); + g_free (val); + + g_mime_param_write_to_string (content_type->params, TRUE, out); + g_object_unref (content_type); + + nwritten = g_mime_stream_write (stream, out->str, out->len); + g_string_free (out, TRUE); + + return nwritten; +} + +static void +content_type_changed (GMimeContentType *content_type, gpointer args, GMimeObject *object) +{ + GMimeParam *params; + GString *string; + char *type, *p; + + string = g_string_new ("Content-Type: "); + + type = g_mime_content_type_to_string (content_type); + g_string_append (string, type); + g_free (type); + + if ((params = content_type->params)) + g_mime_param_write_to_string (params, FALSE, string); + + p = string->str; + g_string_free (string, FALSE); + + type = p + strlen ("Content-Type: "); + g_mime_header_list_set (object->headers, "Content-Type", type); + g_free (p); +} + +static ssize_t +write_disposition (GMimeStream *stream, const char *name, const char *value) +{ + GMimeContentDisposition *disposition; + ssize_t nwritten; + GString *out; + + out = g_string_new (""); + g_string_printf (out, "%s: ", name); + + disposition = g_mime_content_disposition_new_from_string (value); + g_string_append (out, disposition->disposition); + + g_mime_param_write_to_string (disposition->params, TRUE, out); + g_object_unref (disposition); + + nwritten = g_mime_stream_write (stream, out->str, out->len); + g_string_free (out, TRUE); + + return nwritten; +} + +static void +content_disposition_changed (GMimeContentDisposition *disposition, gpointer args, GMimeObject *object) +{ + char *str; + + if (object->disposition) { + str = g_mime_content_disposition_to_string (object->disposition, FALSE); + g_mime_header_list_set (object->headers, "Content-Disposition", str); + g_free (str); + } else { + g_mime_header_list_remove (object->headers, "Content-Disposition"); + } +} + + +/** + * g_mime_object_register_type: + * @type: mime type + * @subtype: mime subtype + * @object_type: object type + * + * Registers the object type @object_type for use with the + * g_mime_object_new_type() convenience function. + * + * Note: You may use the wildcard "*" to match any type and/or + * subtype. + **/ +void +g_mime_object_register_type (const char *type, const char *subtype, GType object_type) +{ + struct _type_bucket *bucket; + struct _subtype_bucket *sub; + + g_return_if_fail (object_type != 0); + g_return_if_fail (subtype != NULL); + g_return_if_fail (type != NULL); + + if (!(bucket = g_hash_table_lookup (type_hash, type))) { + bucket = g_new (struct _type_bucket, 1); + bucket->type = g_strdup (type); + bucket->object_type = *type == '*' ? object_type : 0; + bucket->subtype_hash = g_hash_table_new (g_mime_strcase_hash, g_mime_strcase_equal); + g_hash_table_insert (type_hash, bucket->type, bucket); + } + + sub = g_new (struct _subtype_bucket, 1); + sub->subtype = g_strdup (subtype); + sub->object_type = object_type; + g_hash_table_insert (bucket->subtype_hash, sub->subtype, sub); +} + + +/** + * g_mime_object_new: + * @content_type: a #GMimeContentType object + * + * Performs a lookup of registered #GMimeObject subclasses, registered + * using g_mime_object_register_type(), to find an appropriate class + * capable of handling MIME parts of the specified Content-Type. If no + * class has been registered to handle that type, it looks for a + * registered class that can handle @content_type's media type. If + * that also fails, then it will use the generic part class, + * #GMimePart. + * + * Returns: an appropriate #GMimeObject registered to handle MIME + * parts appropriate for @content_type. + **/ +GMimeObject * +g_mime_object_new (GMimeContentType *content_type) +{ + struct _type_bucket *bucket; + struct _subtype_bucket *sub; + GMimeObject *object; + GType obj_type; + + g_return_val_if_fail (GMIME_IS_CONTENT_TYPE (content_type), NULL); + + if ((bucket = g_hash_table_lookup (type_hash, content_type->type))) { + if (!(sub = g_hash_table_lookup (bucket->subtype_hash, content_type->subtype))) + sub = g_hash_table_lookup (bucket->subtype_hash, "*"); + + obj_type = sub ? sub->object_type : 0; + } else { + bucket = g_hash_table_lookup (type_hash, "*"); + obj_type = bucket ? bucket->object_type : 0; + } + + if (!obj_type) { + /* use the default mime object */ + if ((bucket = g_hash_table_lookup (type_hash, "*"))) { + sub = g_hash_table_lookup (bucket->subtype_hash, "*"); + obj_type = sub ? sub->object_type : 0; + } + + if (!obj_type) + return NULL; + } + + object = g_object_newv (obj_type, 0, NULL); + + g_mime_object_set_content_type (object, content_type); + + return object; +} + + +/** + * g_mime_object_new_type: + * @type: mime type + * @subtype: mime subtype + * + * Performs a lookup of registered #GMimeObject subclasses, registered + * using g_mime_object_register_type(), to find an appropriate class + * capable of handling MIME parts of type @type/@subtype. If no class + * has been registered to handle that type, it looks for a registered + * class that can handle @type. If that also fails, then it will use + * the generic part class, #GMimePart. + * + * Returns: an appropriate #GMimeObject registered to handle mime-types + * of @type/@subtype. + **/ +GMimeObject * +g_mime_object_new_type (const char *type, const char *subtype) +{ + struct _type_bucket *bucket; + struct _subtype_bucket *sub; + GType obj_type; + + g_return_val_if_fail (type != NULL, NULL); + + if ((bucket = g_hash_table_lookup (type_hash, type))) { + if (!(sub = g_hash_table_lookup (bucket->subtype_hash, subtype))) + sub = g_hash_table_lookup (bucket->subtype_hash, "*"); + + obj_type = sub ? sub->object_type : 0; + } else { + bucket = g_hash_table_lookup (type_hash, "*"); + obj_type = bucket ? bucket->object_type : 0; + } + + if (!obj_type) { + /* use the default mime object */ + if ((bucket = g_hash_table_lookup (type_hash, "*"))) { + sub = g_hash_table_lookup (bucket->subtype_hash, "*"); + obj_type = sub ? sub->object_type : 0; + } + + if (!obj_type) + return NULL; + } + + return g_object_newv (obj_type, 0, NULL); +} + + +static void +object_set_content_type (GMimeObject *object, GMimeContentType *content_type) +{ + if (object->content_type) { + g_mime_event_remove (object->content_type->priv, (GMimeEventCallback) content_type_changed, object); + g_object_unref (object->content_type); + } + + g_mime_event_add (content_type->priv, (GMimeEventCallback) content_type_changed, object); + object->content_type = content_type; + g_object_ref (content_type); +} + + +/** + * _g_mime_object_set_content_type: + * @object: a #GMimeObject + * @content_type: a #GMimeContentType object + * + * Sets the content-type for the specified MIME object. + * + * Note: This method is meant for internal-use only and avoids + * serialization of @content_type to the Content-Type header field. + **/ +void +_g_mime_object_set_content_type (GMimeObject *object, GMimeContentType *content_type) +{ + GMIME_OBJECT_GET_CLASS (object)->set_content_type (object, content_type); +} + + +/** + * g_mime_object_set_content_type: + * @object: a #GMimeObject + * @content_type: a #GMimeContentType object + * + * Sets the content-type for the specified MIME object and then + * serializes it to the Content-Type header field. + **/ +void +g_mime_object_set_content_type (GMimeObject *object, GMimeContentType *content_type) +{ + g_return_if_fail (GMIME_IS_CONTENT_TYPE (content_type)); + g_return_if_fail (GMIME_IS_OBJECT (object)); + + if (object->content_type == content_type) + return; + + GMIME_OBJECT_GET_CLASS (object)->set_content_type (object, content_type); + + content_type_changed (content_type, NULL, object); +} + + +/** + * g_mime_object_get_content_type: + * @object: a #GMimeObject + * + * Gets the #GMimeContentType object for the given MIME object or + * %NULL on fail. + * + * Returns: the content-type object for the specified MIME object. + **/ +GMimeContentType * +g_mime_object_get_content_type (GMimeObject *object) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); + + return object->content_type; +} + + +/** + * g_mime_object_set_content_type_parameter: + * @object: a #GMimeObject + * @name: param name + * @value: param value + * + * Sets the content-type param @name to the value @value. + **/ +void +g_mime_object_set_content_type_parameter (GMimeObject *object, const char *name, const char *value) +{ + g_return_if_fail (GMIME_IS_OBJECT (object)); + g_return_if_fail (name != NULL); + + g_mime_content_type_set_parameter (object->content_type, name, value); +} + + +/** + * g_mime_object_get_content_type_parameter: + * @object: a #GMimeObject + * @name: param name + * + * Gets the value of the content-type param @name set on the MIME part + * @object. + * + * Returns: the value of the requested content-type param or %NULL on + * if the param doesn't exist. + **/ +const char * +g_mime_object_get_content_type_parameter (GMimeObject *object, const char *name) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); + g_return_val_if_fail (name != NULL, NULL); + + return g_mime_content_type_get_parameter (object->content_type, name); +} + + +/** + * g_mime_object_get_content_disposition: + * @object: a #GMimeObject + * + * Gets the #GMimeContentDisposition for the specified MIME object. + * + * Returns: the #GMimeContentDisposition set on the MIME object. + **/ +GMimeContentDisposition * +g_mime_object_get_content_disposition (GMimeObject *object) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); + + return object->disposition; +} + +/** + * g_mime_object_set_content_disposition: + * @object: a #GMimeObject + * @disposition: a #GMimeContentDisposition object + * + * Set the content disposition for the specified mime part. + * + * Note: This method is meant for internal-use only and avoids + * serialization of @disposition to the Content-Disposition header + * field. + **/ +static void +_g_mime_object_set_content_disposition (GMimeObject *object, GMimeContentDisposition *disposition) +{ + if (object->disposition) { + g_mime_event_remove (object->disposition->priv, (GMimeEventCallback) content_disposition_changed, object); + g_object_unref (object->disposition); + } + + g_mime_event_add (disposition->priv, (GMimeEventCallback) content_disposition_changed, object); + object->disposition = disposition; + g_object_ref (disposition); +} + + +/** + * g_mime_object_set_content_disposition: + * @object: a #GMimeObject + * @disposition: a #GMimeContentDisposition object + * + * Set the content disposition for the specified mime part and then + * serializes it to the Content-Disposition header field. + **/ +void +g_mime_object_set_content_disposition (GMimeObject *object, GMimeContentDisposition *disposition) +{ + g_return_if_fail (GMIME_IS_CONTENT_DISPOSITION (disposition)); + g_return_if_fail (GMIME_IS_OBJECT (object)); + + if (object->disposition == disposition) + return; + + _g_mime_object_set_content_disposition (object, disposition); + + content_disposition_changed (disposition, NULL, object); +} + + +/** + * g_mime_object_set_disposition: + * @object: a #GMimeObject + * @disposition: disposition ("attachment" or "inline") + * + * Sets the disposition to @disposition which may be one of + * #GMIME_DISPOSITION_ATTACHMENT or #GMIME_DISPOSITION_INLINE or, by + * your choice, any other string which would indicate how the MIME + * part should be displayed by the MUA. + **/ +void +g_mime_object_set_disposition (GMimeObject *object, const char *disposition) +{ + GMimeContentDisposition *disp; + + g_return_if_fail (GMIME_IS_OBJECT (object)); + g_return_if_fail (disposition != NULL); + + if (object->disposition) { + g_mime_content_disposition_set_disposition (object->disposition, disposition); + return; + } + + disp = g_mime_content_disposition_new (); + g_mime_content_disposition_set_disposition (disp, disposition); + g_mime_object_set_content_disposition (object, disp); + g_object_unref (disp); +} + + +/** + * g_mime_object_get_disposition: + * @object: a #GMimeObject + * + * Gets the MIME object's disposition if set or %NULL otherwise. + * + * Returns: the disposition string which is probably one of + * #GMIME_DISPOSITION_ATTACHMENT or #GMIME_DISPOSITION_INLINE. + **/ +const char * +g_mime_object_get_disposition (GMimeObject *object) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); + + if (object->disposition) + return g_mime_content_disposition_get_disposition (object->disposition); + + return NULL; +} + + +/** + * g_mime_object_set_content_disposition_parameter: + * @object: a #GMimeObject + * @attribute: parameter name + * @value: parameter value + * + * Add a content-disposition parameter to the specified mime part. + **/ +void +g_mime_object_set_content_disposition_parameter (GMimeObject *object, const char *attribute, const char *value) +{ + GMimeContentDisposition *disposition; + + g_return_if_fail (GMIME_IS_OBJECT (object)); + g_return_if_fail (attribute != NULL); + + if (!object->disposition) { + disposition = g_mime_content_disposition_new (); + _g_mime_object_set_content_disposition (object, disposition); + } + + g_mime_content_disposition_set_parameter (object->disposition, attribute, value); +} + + +/** + * g_mime_object_get_content_disposition_parameter: + * @object: a #GMimeObject + * @attribute: parameter name + * + * Gets the value of the Content-Disposition parameter specified by + * @attribute, or %NULL if the parameter does not exist. + * + * Returns: the value of a previously defined content-disposition + * parameter specified by @attribute. + **/ +const char * +g_mime_object_get_content_disposition_parameter (GMimeObject *object, const char *attribute) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); + g_return_val_if_fail (attribute != NULL, NULL); + + if (!object->disposition) + return NULL; + + return g_mime_content_disposition_get_parameter (object->disposition, attribute); +} + + +/** + * g_mime_object_set_content_id: + * @object: a #GMimeObject + * @content_id: content-id (addr-spec portion) + * + * Sets the Content-Id of the MIME object. + **/ +void +g_mime_object_set_content_id (GMimeObject *object, const char *content_id) +{ + char *msgid; + + g_return_if_fail (GMIME_IS_OBJECT (object)); + + g_free (object->content_id); + object->content_id = g_strdup (content_id); + + msgid = g_strdup_printf ("<%s>", content_id); + g_mime_object_set_header (object, "Content-Id", msgid); + g_free (msgid); +} + + +/** + * g_mime_object_get_content_id: + * @object: a #GMimeObject + * + * Gets the Content-Id of the MIME object or NULL if one is not set. + * + * Returns: a const pointer to the Content-Id header. + **/ +const char * +g_mime_object_get_content_id (GMimeObject *object) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); + + return object->content_id; +} + + +enum { + HEADER_CONTENT_DISPOSITION, + HEADER_CONTENT_TYPE, + HEADER_CONTENT_ID, + HEADER_UNKNOWN, +}; + +static char *content_headers[] = { + "Content-Disposition", + "Content-Type", + "Content-Id", +}; + +static gboolean +process_header (GMimeObject *object, const char *header, const char *value) +{ + GMimeContentDisposition *disposition; + GMimeContentType *content_type; + guint i; + + if (g_ascii_strncasecmp (header, "Content-", 8) != 0) + return FALSE; + + for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { + if (!g_ascii_strcasecmp (content_headers[i] + 8, header + 8)) + break; + } + + switch (i) { + case HEADER_CONTENT_DISPOSITION: + disposition = g_mime_content_disposition_new_from_string (value); + _g_mime_object_set_content_disposition (object, disposition); + g_object_unref (disposition); + break; + case HEADER_CONTENT_TYPE: + content_type = g_mime_content_type_new_from_string (value); + _g_mime_object_set_content_type (object, content_type); + g_object_unref (content_type); + break; + case HEADER_CONTENT_ID: + g_free (object->content_id); + object->content_id = g_mime_utils_decode_message_id (value); + break; + default: + return FALSE; + } + + g_mime_header_list_set (object->headers, header, value); + + return TRUE; +} + +static void +object_prepend_header (GMimeObject *object, const char *header, const char *value) +{ + if (!process_header (object, header, value)) + g_mime_header_list_prepend (object->headers, header, value); +} + + +/** + * g_mime_object_prepend_header: + * @object: a #GMimeObject + * @header: header name + * @value: header value + * + * Prepends a raw, unprocessed header to the MIME object. + **/ +void +g_mime_object_prepend_header (GMimeObject *object, const char *header, const char *value) +{ + g_return_if_fail (GMIME_IS_OBJECT (object)); + g_return_if_fail (header != NULL); + g_return_if_fail (value != NULL); + + GMIME_OBJECT_GET_CLASS (object)->prepend_header (object, header, value); +} + +static void +object_append_header (GMimeObject *object, const char *header, const char *value) +{ + if (!process_header (object, header, value)) + g_mime_header_list_append (object->headers, header, value); +} + + +/** + * g_mime_object_append_header: + * @object: a #GMimeObject + * @header: header name + * @value: header value + * + * Appends a raw, unprocessed header to the MIME object. + **/ +void +g_mime_object_append_header (GMimeObject *object, const char *header, const char *value) +{ + g_return_if_fail (GMIME_IS_OBJECT (object)); + g_return_if_fail (header != NULL); + g_return_if_fail (value != NULL); + + GMIME_OBJECT_GET_CLASS (object)->append_header (object, header, value); +} + + +static void +object_set_header (GMimeObject *object, const char *header, const char *value) +{ + if (!process_header (object, header, value)) + g_mime_header_list_set (object->headers, header, value); +} + + +/** + * g_mime_object_set_header: + * @object: a #GMimeObject + * @header: header name + * @value: header value + * + * Sets an arbitrary raw, unprocessed header on the MIME object. + **/ +void +g_mime_object_set_header (GMimeObject *object, const char *header, const char *value) +{ + g_return_if_fail (GMIME_IS_OBJECT (object)); + g_return_if_fail (header != NULL); + g_return_if_fail (value != NULL); + + GMIME_OBJECT_GET_CLASS (object)->set_header (object, header, value); +} + + +static const char * +object_get_header (GMimeObject *object, const char *header) +{ + return g_mime_header_list_get (object->headers, header); +} + + +/** + * g_mime_object_get_header: + * @object: a #GMimeObject + * @header: header name + * + * Gets the raw, unprocessed value of the requested header. + * + * Returns: the raw, unprocessed value of the requested header if it + * exists or %NULL otherwise. + **/ +const char * +g_mime_object_get_header (GMimeObject *object, const char *header) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); + g_return_val_if_fail (header != NULL, NULL); + + return GMIME_OBJECT_GET_CLASS (object)->get_header (object, header); +} + + +static gboolean +object_remove_header (GMimeObject *object, const char *header) +{ + guint i; + + for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { + if (!g_ascii_strcasecmp (content_headers[i], header)) + break; + } + + switch (i) { + case HEADER_CONTENT_DISPOSITION: + if (object->disposition) { + g_mime_event_remove (object->disposition->priv, (GMimeEventCallback) content_disposition_changed, object); + g_object_unref (object->disposition); + object->disposition = NULL; + } + break; + case HEADER_CONTENT_TYPE: + /* never allow the removal of the Content-Type header */ + return FALSE; + case HEADER_CONTENT_ID: + g_free (object->content_id); + object->content_id = NULL; + break; + default: + break; + } + + return g_mime_header_list_remove (object->headers, header); +} + + +/** + * g_mime_object_remove_header: + * @object: a #GMimeObject + * @header: header name + * + * Removed the specified header if it exists. + * + * Returns: %TRUE if the header was removed or %FALSE if it could not + * be found. + **/ +gboolean +g_mime_object_remove_header (GMimeObject *object, const char *header) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), FALSE); + g_return_val_if_fail (header != NULL, FALSE); + + return GMIME_OBJECT_GET_CLASS (object)->remove_header (object, header); +} + + +static char * +object_get_headers (GMimeObject *object) +{ + return g_mime_header_list_to_string (object->headers); +} + + +/** + * g_mime_object_get_headers: + * @object: a #GMimeObject + * + * Allocates a string buffer containing all of the MIME object's raw + * headers. + * + * Returns: an allocated string containing all of the raw MIME headers. + **/ +char * +g_mime_object_get_headers (GMimeObject *object) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); + + return GMIME_OBJECT_GET_CLASS (object)->get_headers (object); +} + + +static ssize_t +object_write_to_stream (GMimeObject *object, GMimeStream *stream) +{ + return -1; +} + + +/** + * g_mime_object_write_to_stream: + * @object: a #GMimeObject + * @stream: stream + * + * Write the contents of the MIME object to @stream. + * + * Returns: the number of bytes written or %-1 on fail. + **/ +ssize_t +g_mime_object_write_to_stream (GMimeObject *object, GMimeStream *stream) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), -1); + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + + return GMIME_OBJECT_GET_CLASS (object)->write_to_stream (object, stream); +} + + +static void +object_encode (GMimeObject *object, GMimeEncodingConstraint constraint) +{ + return; +} + + +/** + * g_mime_object_encode: + * @object: a #GMimeObject + * @constraint: a #GMimeEncodingConstraint + * + * Calculates and sets the most efficient Content-Transfer-Encoding + * for this #GMimeObject and all child parts based on the @constraint + * provided. + **/ +void +g_mime_object_encode (GMimeObject *object, GMimeEncodingConstraint constraint) +{ + g_return_if_fail (GMIME_IS_OBJECT (object)); + + GMIME_OBJECT_GET_CLASS (object)->encode (object, constraint); +} + + +/** + * g_mime_object_to_string: + * @object: a #GMimeObject + * + * Allocates a string buffer containing the contents of @object. + * + * Returns: an allocated string containing the contents of the mime + * object. + **/ +char * +g_mime_object_to_string (GMimeObject *object) +{ + GMimeStream *stream; + GByteArray *array; + char *str; + + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); + + array = g_byte_array_new (); + stream = g_mime_stream_mem_new (); + g_mime_stream_mem_set_byte_array (GMIME_STREAM_MEM (stream), array); + + g_mime_object_write_to_stream (object, stream); + + g_object_unref (stream); + g_byte_array_append (array, (unsigned char *) "", 1); + str = (char *) array->data; + g_byte_array_free (array, FALSE); + + return str; +} + + +/** + * g_mime_object_get_header_list: + * @object: a #GMimeObject + * + * Get the header list for @object. + * + * Returns: the #GMimeHeaderList for @object. Do not free this pointer + * when you are done with it. + **/ +GMimeHeaderList * +g_mime_object_get_header_list (GMimeObject *object) +{ + g_return_val_if_fail (GMIME_IS_OBJECT (object), NULL); + + return object->headers; +} + + +static void +subtype_bucket_foreach (gpointer key, gpointer value, gpointer user_data) +{ + struct _subtype_bucket *bucket = value; + + g_free (bucket->subtype); + g_free (bucket); +} + +static void +type_bucket_foreach (gpointer key, gpointer value, gpointer user_data) +{ + struct _type_bucket *bucket = value; + + g_free (bucket->type); + + if (bucket->subtype_hash) { + g_hash_table_foreach (bucket->subtype_hash, subtype_bucket_foreach, NULL); + g_hash_table_destroy (bucket->subtype_hash); + } + + g_free (bucket); +} + +void +g_mime_object_type_registry_shutdown (void) +{ + g_hash_table_foreach (type_hash, type_bucket_foreach, NULL); + g_hash_table_destroy (type_hash); + type_hash = NULL; +} + +void +g_mime_object_type_registry_init (void) +{ + if (type_hash) + return; + + type_hash = g_hash_table_new (g_mime_strcase_hash, g_mime_strcase_equal); +} diff --git a/gmime/gmime-object.h b/gmime/gmime-object.h new file mode 100644 index 0000000..44adbd5 --- /dev/null +++ b/gmime/gmime-object.h @@ -0,0 +1,142 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_OBJECT_H__ +#define __GMIME_OBJECT_H__ + +#include +#include + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_OBJECT (g_mime_object_get_type ()) +#define GMIME_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_OBJECT, GMimeObject)) +#define GMIME_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_OBJECT, GMimeObjectClass)) +#define GMIME_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_OBJECT)) +#define GMIME_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_OBJECT)) +#define GMIME_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_OBJECT, GMimeObjectClass)) + +typedef struct _GMimeObject GMimeObject; +typedef struct _GMimeObjectClass GMimeObjectClass; + +/** + * GMimeObject: + * @parent_object: parent #GObject + * @disposition: a #GMimeContentDisposition + * @content_type: a #GMimeContentType + * @content_id: a Content-Id + * @headers: a #GMimeHeaderList + * + * Base class for all MIME parts. + **/ +struct _GMimeObject { + GObject parent_object; + + GMimeContentDisposition *disposition; + GMimeContentType *content_type; + GMimeHeaderList *headers; + + char *content_id; +}; + +struct _GMimeObjectClass { + GObjectClass parent_class; + + void (* prepend_header) (GMimeObject *object, const char *header, const char *value); + void (* append_header) (GMimeObject *object, const char *header, const char *value); + void (* set_header) (GMimeObject *object, const char *header, const char *value); + const char * (* get_header) (GMimeObject *object, const char *header); + gboolean (* remove_header) (GMimeObject *object, const char *header); + + void (* set_content_type) (GMimeObject *object, GMimeContentType *content_type); + + char * (* get_headers) (GMimeObject *object); + + ssize_t (* write_to_stream) (GMimeObject *object, GMimeStream *stream); + + void (* encode) (GMimeObject *object, GMimeEncodingConstraint constraint); +}; + + +/** + * GMimeObjectForeachFunc: + * @parent: parent #GMimeObject + * @part: a #GMimeObject + * @user_data: User-supplied callback data. + * + * The function signature for a callback to g_mime_message_foreach() + * and g_mime_multipart_foreach(). + **/ +typedef void (* GMimeObjectForeachFunc) (GMimeObject *parent, GMimeObject *part, gpointer user_data); + + +GType g_mime_object_get_type (void); + +void g_mime_object_register_type (const char *type, const char *subtype, GType object_type); + +GMimeObject *g_mime_object_new (GMimeContentType *content_type); +GMimeObject *g_mime_object_new_type (const char *type, const char *subtype); + +void g_mime_object_set_content_type (GMimeObject *object, GMimeContentType *content_type); +GMimeContentType *g_mime_object_get_content_type (GMimeObject *object); +void g_mime_object_set_content_type_parameter (GMimeObject *object, const char *name, const char *value); +const char *g_mime_object_get_content_type_parameter (GMimeObject *object, const char *name); + +void g_mime_object_set_content_disposition (GMimeObject *object, GMimeContentDisposition *disposition); +GMimeContentDisposition *g_mime_object_get_content_disposition (GMimeObject *object); + +void g_mime_object_set_disposition (GMimeObject *object, const char *disposition); +const char *g_mime_object_get_disposition (GMimeObject *object); + +void g_mime_object_set_content_disposition_parameter (GMimeObject *object, const char *attribute, const char *value); +const char *g_mime_object_get_content_disposition_parameter (GMimeObject *object, const char *attribute); + +void g_mime_object_set_content_id (GMimeObject *object, const char *content_id); +const char *g_mime_object_get_content_id (GMimeObject *object); + +void g_mime_object_prepend_header (GMimeObject *object, const char *header, const char *value); +void g_mime_object_append_header (GMimeObject *object, const char *header, const char *value); +void g_mime_object_set_header (GMimeObject *object, const char *header, const char *value); +const char *g_mime_object_get_header (GMimeObject *object, const char *header); +gboolean g_mime_object_remove_header (GMimeObject *object, const char *header); + +GMimeHeaderList *g_mime_object_get_header_list (GMimeObject *object); + +char *g_mime_object_get_headers (GMimeObject *object); + +ssize_t g_mime_object_write_to_stream (GMimeObject *object, GMimeStream *stream); +char *g_mime_object_to_string (GMimeObject *object); + +void g_mime_object_encode (GMimeObject *object, GMimeEncodingConstraint constraint); + +/* Internal API */ +G_GNUC_INTERNAL void g_mime_object_type_registry_init (void); +G_GNUC_INTERNAL void g_mime_object_type_registry_shutdown (void); + +G_END_DECLS + +#endif /* __GMIME_OBJECT_H__ */ diff --git a/gmime/gmime-param.c b/gmime/gmime-param.c new file mode 100644 index 0000000..496ef0d --- /dev/null +++ b/gmime/gmime-param.c @@ -0,0 +1,1002 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include "gmime-param.h" +#include "gmime-common.h" +#include "gmime-table-private.h" +#include "gmime-parse-utils.h" +#include "gmime-iconv-utils.h" +#include "gmime-charset.h" +#include "gmime-utils.h" +#include "gmime-iconv.h" + + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + +#define d(x) + + +/** + * SECTION: gmime-param + * @title: GMimeParam + * @short_description: Content-Type and Content-Disposition parameters + * @see_also: #GMimeContentType + * + * A #GMimeParam is a parameter name/value pair as found on MIME + * header fields such as Content-Type and Content-Disposition. + **/ + + +static unsigned char tohex[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' +}; + + +/** + * g_mime_param_new: + * @name: parameter name + * @value: parameter value + * + * Creates a new #GMimeParam node with name @name and value @value. + * + * Returns: a new paramter structure. + **/ +GMimeParam * +g_mime_param_new (const char *name, const char *value) +{ + GMimeParam *param; + + param = g_new (GMimeParam, 1); + + param->next = NULL; + param->name = g_strdup (name); + param->value = g_strdup (value); + + return param; +} + +#define INT_OVERFLOW(x,d) (((x) > (INT_MAX / 10)) || ((x) == (INT_MAX / 10) && (d) > (INT_MAX % 10))) + +static int +decode_int (const char **in) +{ + const unsigned char *inptr; + int digit, n = 0; + + decode_lwsp (in); + + inptr = (const unsigned char *) *in; + while (isdigit ((int) *inptr)) { + digit = (*inptr - '0'); + if (INT_OVERFLOW (n, digit)) { + while (isdigit ((int) *inptr)) + inptr++; + break; + } + + n = (n * 10) + digit; + + inptr++; + } + + *in = (const char *) inptr; + + return n; +} + +static char * +decode_quoted_string (const char **in) +{ + const char *start, *inptr = *in; + char *outptr, *out = NULL; + gboolean unescape = FALSE; + + decode_lwsp (&inptr); + + if (*inptr != '"') { + *in = inptr; + return NULL; + } + + start = inptr++; + + while (*inptr && *inptr != '"') { + if (*inptr++ == '\\') { + unescape = TRUE; + inptr++; + } + } + + if (*inptr == '"') { + start++; + out = g_strndup (start, (size_t) (inptr - start)); + inptr++; + } else { + /* string wasn't properly quoted */ + out = g_strndup (start, (size_t) (inptr - start)); + } + + *in = inptr; + + if (unescape) { + inptr = outptr = out; + while (*inptr) { + if (*inptr == '\\') + inptr++; + *outptr++ = *inptr++; + } + + *outptr = '\0'; + } + + return out; +} + +static char * +decode_token (const char **in) +{ + const char *inptr = *in; + const char *start; + + decode_lwsp (&inptr); + + start = inptr; +#ifdef STRICT_PARSER + while (is_ttoken (*inptr)) + inptr++; +#else + /* Broken mail clients like to make our lives difficult. Scan + * for a ';' instead of trusting that the client followed the + * specification. */ + while (*inptr && *inptr != ';') + inptr++; + + /* Scan backwards over any trailing lwsp */ + while (inptr > start && is_lwsp (inptr[-1])) + inptr--; +#endif + + if (inptr > start) { + *in = inptr; + return g_strndup (start, (size_t) (inptr - start)); + } else { + return NULL; + } +} + +static char * +decode_value (const char **in) +{ + const char *inptr = *in; + + decode_lwsp (&inptr); + *in = inptr; + + if (*inptr == '"') { + return decode_quoted_string (in); + } else if (is_ttoken (*inptr)) { + return decode_token (in); + } + +#ifndef STRICT_PARSER + return decode_token (in); +#else + return NULL; +#endif +} + +/* This function is basically the same as decode_token() + * except that it will not accept *'s which have a special + * meaning for rfc2184 params */ +static char * +decode_param_token (const char **in) +{ + const char *inptr = *in; + const char *start; + + decode_lwsp (&inptr); + + start = inptr; + while (is_ttoken (*inptr) && *inptr != '*') + inptr++; + if (inptr > start) { + *in = inptr; + return g_strndup (start, (size_t) (inptr - start)); + } else { + return NULL; + } +} + +static gboolean +decode_rfc2184_param (const char **in, char **paramp, int *part, gboolean *encoded) +{ + gboolean is_rfc2184 = FALSE; + const char *inptr = *in; + char *param; + + *encoded = FALSE; + *part = -1; + + param = decode_param_token (&inptr); + + decode_lwsp (&inptr); + + if (*inptr == '*') { + is_rfc2184 = TRUE; + inptr++; + + decode_lwsp (&inptr); + if (*inptr == '=') { + /* form := param*=value */ + *encoded = TRUE; + } else { + /* form := param*#=value or param*#*=value */ + *part = decode_int (&inptr); + + decode_lwsp (&inptr); + if (*inptr == '*') { + /* form := param*#*=value */ + inptr++; + *encoded = TRUE; + decode_lwsp (&inptr); + } + } + } + + if (paramp) + *paramp = param; + + if (param) + *in = inptr; + + return is_rfc2184; +} + +static gboolean +decode_param (const char **in, char **paramp, char **valuep, int *id, gboolean *encoded) +{ + gboolean is_rfc2184 = FALSE; + const char *inptr = *in; + char *param, *value = NULL; + char *val; + + is_rfc2184 = decode_rfc2184_param (&inptr, ¶m, id, encoded); + + if (*inptr == '=') { + inptr++; + value = decode_value (&inptr); + + if (!is_rfc2184 && value) { + if (strstr (value, "=?") != NULL) { + /* We (may) have a broken param value that is rfc2047 + * encoded. Since both Outlook and Netscape/Mozilla do + * this, we should handle this case. + */ + + if ((val = g_mime_utils_header_decode_text (value))) { + g_free (value); + value = val; + } + } + + if (!g_utf8_validate (value, -1, NULL)) { + /* A (broken) mailer has sent us an unencoded 8bit value. + * Attempt to save it by assuming it's in the user's + * locale and converting to UTF-8 */ + + if ((val = g_mime_iconv_locale_to_utf8 (value))) { + g_free (value); + value = val; + } else { + d(g_warning ("Failed to convert %s param value (\"%s\") to UTF-8: %s", + param, value, g_strerror (errno))); + } + } + } + } + + if (param && value) { + *paramp = param; + *valuep = value; + *in = inptr; + return TRUE; + } else { + g_free (param); + g_free (value); + return FALSE; + } +} + + +struct _rfc2184_part { + char *value; + int id; +}; + +struct _rfc2184_param { + struct _rfc2184_param *next; + const char *charset; + GMimeParam *param; + GPtrArray *parts; + char *lang; +}; + +static int +rfc2184_sort_cb (const void *v0, const void *v1) +{ + const struct _rfc2184_part *p0 = *((struct _rfc2184_part **) v0); + const struct _rfc2184_part *p1 = *((struct _rfc2184_part **) v1); + + return p0->id - p1->id; +} + +#define HEXVAL(c) (isdigit (c) ? (c) - '0' : tolower (c) - 'a' + 10) + +static size_t +hex_decode (const char *in, size_t len, char *out) +{ + register const unsigned char *inptr = (const unsigned char *) in; + register unsigned char *outptr = (unsigned char *) out; + const unsigned char *inend = inptr + len; + + while (inptr < inend) { + if (*inptr == '%') { + if (isxdigit (inptr[1]) && isxdigit (inptr[2])) { + *outptr++ = HEXVAL (inptr[1]) * 16 + HEXVAL (inptr[2]); + inptr += 3; + } else + *outptr++ = *inptr++; + } else + *outptr++ = *inptr++; + } + + *outptr = '\0'; + + return ((char *) outptr) - out; +} + +static const char * +rfc2184_param_charset (const char **in, char **langp) +{ + const char *lang, *inptr = *in; + char *charset; + size_t len; + + if (langp) + *langp = NULL; + + while (*inptr != '\0' && *inptr != '\'') + inptr++; + + if (*inptr != '\'') + return NULL; + + len = inptr - *in; + charset = g_alloca (len + 1); + memcpy (charset, *in, len); + charset[len] = '\0'; + + lang = ++inptr; + while (*inptr != '\0' && *inptr != '\'') + inptr++; + + if (*inptr == '\'') { + if (langp) + *langp = g_strndup (lang, (size_t) (inptr - lang)); + + inptr++; + } + + *in = inptr; + + return g_mime_charset_canon_name (charset); +} + +static char * +charset_convert (const char *charset, char *in, size_t inlen) +{ + gboolean locale = FALSE; + char *result = NULL; + iconv_t cd; + + if (!charset || !g_ascii_strcasecmp (charset, "UTF-8") || !g_ascii_strcasecmp (charset, "us-ascii")) { + /* we shouldn't need any charset conversion here... */ + if (g_utf8_validate (in, inlen, NULL)) + return in; + + charset = g_mime_locale_charset (); + locale = TRUE; + } + + /* need charset conversion */ + cd = g_mime_iconv_open ("UTF-8", charset); + if (cd == (iconv_t) -1 && !locale) { + charset = g_mime_locale_charset (); + cd = g_mime_iconv_open ("UTF-8", charset); + } + + if (cd != (iconv_t) -1) { + result = g_mime_iconv_strndup (cd, in, inlen); + g_mime_iconv_close (cd); + } + + if (result == NULL) + result = in; + else + g_free (in); + + return result; +} + +static char * +rfc2184_decode (const char *value) +{ + const char *inptr = value; + const char *charset; + char *decoded; + size_t len; + + charset = rfc2184_param_charset (&inptr, NULL); + + len = strlen (inptr); + decoded = g_alloca (len + 1); + len = hex_decode (inptr, len, decoded); + + return charset_convert (charset, g_strdup (decoded), len); +} + +static void +rfc2184_param_add_part (struct _rfc2184_param *rfc2184, char *value, int id, gboolean encoded) +{ + struct _rfc2184_part *part; + size_t len; + + part = g_new (struct _rfc2184_part, 1); + g_ptr_array_add (rfc2184->parts, part); + part->id = id; + + if (encoded) { + len = strlen (value); + part->value = g_malloc (len + 1); + hex_decode (value, len, part->value); + g_free (value); + } else { + part->value = value; + } +} + +static struct _rfc2184_param * +rfc2184_param_new (char *name, char *value, int id, gboolean encoded) +{ + struct _rfc2184_param *rfc2184; + const char *inptr = value; + + rfc2184 = g_new (struct _rfc2184_param, 1); + rfc2184->parts = g_ptr_array_new (); + rfc2184->next = NULL; + + if (encoded) { + rfc2184->charset = rfc2184_param_charset (&inptr, &rfc2184->lang); + } else { + rfc2184->charset = NULL; + rfc2184->lang = NULL; + } + + if (inptr == value) { + rfc2184_param_add_part (rfc2184, value, id, encoded); + } else { + rfc2184_param_add_part (rfc2184, g_strdup (inptr), id, encoded); + g_free (value); + } + + rfc2184->param = g_new (GMimeParam, 1); + rfc2184->param->next = NULL; + rfc2184->param->name = name; + rfc2184->param->value = NULL; + + return rfc2184; +} + +static GMimeParam * +decode_param_list (const char *in) +{ + struct _rfc2184_param *rfc2184, *list, *t; + GMimeParam *param, *params, *tail; + struct _rfc2184_part *part; + GHashTable *rfc2184_hash; + const char *inptr = in; + char *name, *value; + gboolean encoded; + GString *gvalue; + guint i; + int id; + + params = NULL; + tail = (GMimeParam *) ¶ms; + + list = NULL; + t = (struct _rfc2184_param *) &list; + rfc2184_hash = g_hash_table_new (g_mime_strcase_hash, g_mime_strcase_equal); + + decode_lwsp (&inptr); + + do { + /* invalid format? */ + if (!decode_param (&inptr, &name, &value, &id, &encoded)) { + decode_lwsp (&inptr); + + if (*inptr == ';') + continue; + + break; + } + + if (id != -1) { + /* we have a multipart rfc2184 param */ + if (!(rfc2184 = g_hash_table_lookup (rfc2184_hash, name))) { + rfc2184 = rfc2184_param_new (name, value, id, encoded); + param = rfc2184->param; + t->next = rfc2184; + t = rfc2184; + + g_hash_table_insert (rfc2184_hash, param->name, rfc2184); + + tail->next = param; + tail = param; + } else { + rfc2184_param_add_part (rfc2184, value, id, encoded); + g_free (name); + } + } else { + param = g_new (GMimeParam, 1); + param->next = NULL; + param->name = name; + + if (encoded) { + /* singleton encoded rfc2184 param value */ + param->value = rfc2184_decode (value); + g_free (value); + } else { + /* normal parameter value */ + param->value = value; + } + + tail->next = param; + tail = param; + } + + decode_lwsp (&inptr); + } while (*inptr++ == ';'); + + g_hash_table_destroy (rfc2184_hash); + + rfc2184 = list; + while (rfc2184 != NULL) { + t = rfc2184->next; + + param = rfc2184->param; + gvalue = g_string_new (""); + + g_ptr_array_sort (rfc2184->parts, rfc2184_sort_cb); + for (i = 0; i < rfc2184->parts->len; i++) { + part = rfc2184->parts->pdata[i]; + g_string_append (gvalue, part->value); + g_free (part->value); + g_free (part); + } + + g_ptr_array_free (rfc2184->parts, TRUE); + + param->value = charset_convert (rfc2184->charset, gvalue->str, gvalue->len); + g_string_free (gvalue, FALSE); + + g_free (rfc2184->lang); + g_free (rfc2184); + rfc2184 = t; + } + + return params; +} + + +/** + * g_mime_param_new_from_string: + * @str: input string + * + * Creates a parameter list based on the input string. + * + * Returns: a #GMimeParam structure based on @string. + **/ +GMimeParam * +g_mime_param_new_from_string (const char *str) +{ + g_return_val_if_fail (str != NULL, NULL); + + return decode_param_list (str); +} + + +/** + * g_mime_param_destroy: + * @param: Mime param list to destroy + * + * Releases all memory used by this mime param back to the Operating + * System. + **/ +void +g_mime_param_destroy (GMimeParam *param) +{ + GMimeParam *next; + + while (param) { + next = param->next; + g_free (param->name); + g_free (param->value); + g_free (param); + param = next; + } +} + + +/** + * g_mime_param_next: + * @param: a #GMimeParam node + * + * Gets the next #GMimeParam node in the list. + * + * Returns: the next #GMimeParam node in the list. + **/ +const GMimeParam * +g_mime_param_next (const GMimeParam *param) +{ + g_return_val_if_fail (param != NULL, NULL); + + return param->next; +} + + +/** + * g_mime_param_get_name: + * @param: a #GMimeParam + * + * Gets the name of the parameter. + * + * Returns: the name of the parameter. + **/ +const char * +g_mime_param_get_name (const GMimeParam *param) +{ + g_return_val_if_fail (param != NULL, NULL); + + return param->name; +} + + +/** + * g_mime_param_get_value: + * @param: a #GMimeParam + * + * Gets the value of the parameter. + * + * Returns: the value of the parameter. + **/ +const char * +g_mime_param_get_value (const GMimeParam *param) +{ + g_return_val_if_fail (param != NULL, NULL); + + return param->value; +} + + +/** + * g_mime_param_append: + * @params: param list + * @name: new param name + * @value: new param value + * + * Appends a new parameter with name @name and value @value to the + * parameter list @params. + * + * Returns: a param list with the new param of name @name and value + * @value appended to the list of params @params. + **/ +GMimeParam * +g_mime_param_append (GMimeParam *params, const char *name, const char *value) +{ + GMimeParam *param, *p; + + g_return_val_if_fail (name != NULL, params); + g_return_val_if_fail (value != NULL, params); + + param = g_mime_param_new (name, value); + if (params) { + p = params; + while (p->next) + p = p->next; + p->next = param; + } else + params = param; + + return params; +} + + +/** + * g_mime_param_append_param: + * @params: param list + * @param: param to append + * + * Appends @param to the param list @params. + * + * Returns: a param list with the new param @param appended to the list + * of params @params. + **/ +GMimeParam * +g_mime_param_append_param (GMimeParam *params, GMimeParam *param) +{ + GMimeParam *p; + + g_return_val_if_fail (param != NULL, params); + + if (params) { + p = params; + while (p->next) + p = p->next; + p->next = param; + } else + params = param; + + return params; +} + +/* FIXME: I wrote this in a quick & dirty fasion - it may not be 100% correct */ +static char * +encode_param (const char *in, gboolean *encoded) +{ + register const unsigned char *inptr = (const unsigned char *) in; + const unsigned char *instart = inptr; + iconv_t cd = (iconv_t) -1; + const char *charset = NULL; + char *outbuf = NULL; + unsigned char c; + char *outstr; + GString *out; + + *encoded = FALSE; + + while (*inptr && ((inptr - instart) < GMIME_FOLD_LEN)) { + if (*inptr > 127) + break; + inptr++; + } + + if (*inptr == '\0') + return g_strdup (in); + + if (*inptr > 127) + charset = g_mime_charset_best (in, strlen (in)); + + if (!charset) + charset = "iso-8859-1"; + + if (g_ascii_strcasecmp (charset, "UTF-8") != 0) + cd = g_mime_iconv_open (charset, "UTF-8"); + + if (cd != (iconv_t) -1) { + outbuf = g_mime_iconv_strdup (cd, in); + g_mime_iconv_close (cd); + if (outbuf == NULL) { + charset = "UTF-8"; + inptr = instart; + } else { + inptr = (const unsigned char *) outbuf; + } + } else { + charset = "UTF-8"; + inptr = instart; + } + + /* FIXME: set the 'language' as well, assuming we can get that info...? */ + out = g_string_new (""); + g_string_append_printf (out, "%s''", charset); + + while ((c = *inptr++)) { + if (!is_attrchar (c)) + g_string_append_printf (out, "%%%c%c", tohex[(c >> 4) & 0xf], tohex[c & 0xf]); + else + g_string_append_c (out, c); + } + + g_free (outbuf); + + outstr = out->str; + g_string_free (out, FALSE); + *encoded = TRUE; + + return outstr; +} + +static void +g_string_append_len_quoted (GString *out, const char *in, size_t len) +{ + register const char *inptr; + const char *inend; + + g_string_append_c (out, '"'); + + inptr = in; + inend = in + len; + + while (inptr < inend) { + if ((*inptr == '"') || *inptr == '\\') + g_string_append_c (out, '\\'); + + g_string_append_c (out, *inptr); + + inptr++; + } + + g_string_append_c (out, '"'); +} + +static void +param_list_format (GString *out, const GMimeParam *param, gboolean fold) +{ + int used = out->len; + + while (param) { + gboolean encoded = FALSE; + int here = out->len; + size_t nlen, vlen; + int quote = 0; + char *value; + + if (!param->value) { + param = param->next; + continue; + } + + if (!(value = encode_param (param->value, &encoded))) { + w(g_warning ("appending parameter %s=%s violates rfc2184", + param->name, param->value)); + value = g_strdup (param->value); + } + + if (!encoded) { + char *ch; + + for (ch = value; *ch; ch++) { + if (!is_attrchar (*ch) || is_lwsp (*ch)) + quote++; + } + } + + nlen = strlen (param->name); + vlen = strlen (value); + + if (fold && (used + nlen + vlen + quote > GMIME_FOLD_LEN - 2)) { + g_string_append (out, ";\n\t"); + here = out->len; + used = 1; + } else { + g_string_append (out, "; "); + here = out->len; + used += 2; + } + + if (nlen + vlen + quote > GMIME_FOLD_LEN - 2) { + /* we need to do special rfc2184 parameter wrapping */ + size_t maxlen = GMIME_FOLD_LEN - (nlen + 6); + char *inptr, *inend; + int i = 0; + + inptr = value; + inend = value + vlen; + + while (inptr < inend) { + char *ptr = inptr + MIN ((size_t) (inend - inptr), maxlen); + + if (encoded && ptr < inend) { + /* be careful not to break an encoded char (ie %20) */ + char *q = ptr; + int j = 2; + + for ( ; j > 0 && q > inptr && *q != '%'; j--, q--); + if (*q == '%') + ptr = q; + } + + if (i != 0) { + if (fold) + g_string_append (out, ";\n\t"); + else + g_string_append (out, "; "); + + here = out->len; + used = 1; + } + + g_string_append_printf (out, "%s*%d%s=", param->name, + i++, encoded ? "*" : ""); + + if (encoded || !quote) + g_string_append_len (out, inptr, (size_t) (ptr - inptr)); + else + g_string_append_len_quoted (out, inptr, (size_t) (ptr - inptr)); + + used += (out->len - here); + + inptr = ptr; + } + } else { + g_string_append_printf (out, "%s%s=", param->name, encoded ? "*" : ""); + + if (encoded || !quote) + g_string_append_len (out, value, vlen); + else + g_string_append_len_quoted (out, value, vlen); + + used += (out->len - here); + } + + g_free (value); + + param = param->next; + } + + if (fold) + g_string_append_c (out, '\n'); +} + + +/** + * g_mime_param_write_to_string: + * @param: MIME Param list + * @fold: specifies whether or not to fold headers + * @str: output string + * + * Assumes the output string contains only the Content-* header and + * it's immediate value. + * + * Writes the params out to the string @string. + **/ +void +g_mime_param_write_to_string (const GMimeParam *param, gboolean fold, GString *str) +{ + g_return_if_fail (str != NULL); + + param_list_format (str, param, fold); +} diff --git a/gmime/gmime-param.h b/gmime/gmime-param.h new file mode 100644 index 0000000..2d33648 --- /dev/null +++ b/gmime/gmime-param.h @@ -0,0 +1,63 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_PARAM_H__ +#define __GMIME_PARAM_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GMimeParam GMimeParam; + + +/** + * GMimeParam: + * @next: Pointer to the next param. + * @name: Parameter name. + * @value: Parameter value. + * + * A parameter name/value pair as used for some Content header fields. + **/ +struct _GMimeParam { + GMimeParam *next; + char *name; + char *value; +}; + + +GMimeParam *g_mime_param_new (const char *name, const char *value); +GMimeParam *g_mime_param_new_from_string (const char *str); +void g_mime_param_destroy (GMimeParam *param); + +const GMimeParam *g_mime_param_next (const GMimeParam *param); + +GMimeParam *g_mime_param_append (GMimeParam *params, const char *name, const char *value); +GMimeParam *g_mime_param_append_param (GMimeParam *params, GMimeParam *param); + +const char *g_mime_param_get_name (const GMimeParam *param); +const char *g_mime_param_get_value (const GMimeParam *param); + +void g_mime_param_write_to_string (const GMimeParam *param, gboolean fold, GString *str); + +G_END_DECLS + +#endif /* __GMIME_PARAM_H__ */ diff --git a/gmime/gmime-parse-utils.c b/gmime/gmime-parse-utils.c new file mode 100644 index 0000000..3e20671 --- /dev/null +++ b/gmime/gmime-parse-utils.c @@ -0,0 +1,310 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-table-private.h" +#include "gmime-parse-utils.h" + + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + +#define d(x) + + +/** + * g_mime_parse_content_type: + * @in: address of input text string + * @type: address of the 'type' output string + * @subtype: address of the 'subtype' output string + * + * Decodes the simple Content-Type type/subtype tokens and updates @in + * to point to the first char after the end of the subtype. + * + * Returns: %TRUE if the string was successfully parsed or %FALSE + * otherwise. + **/ +gboolean +g_mime_parse_content_type (const char **in, char **type, char **subtype) +{ + register const char *inptr; + const char *start = *in; + + decode_lwsp (&start); + inptr = start; + + /* decode the type */ + while (*inptr && is_ttoken (*inptr)) + inptr++; + + *type = g_strndup (start, (size_t) (inptr - start)); + + start = inptr; + decode_lwsp (&start); + + /* check for type/subtype delimeter */ + if (*start++ != '/') { + g_free (*type); + *subtype = NULL; + *type = NULL; + return FALSE; + } + + decode_lwsp (&start); + inptr = start; + + /* decode the subtype */ + while (*inptr && is_ttoken (*inptr)) + inptr++; + + /* check that the subtype exists */ + if (inptr == start) { + g_free (*type); + *subtype = NULL; + *type = NULL; + return FALSE; + } + + *subtype = g_strndup (start, (size_t) (inptr - start)); + + /* update the input string pointer */ + *in = inptr; + + return TRUE; +} + + +/** + * g_mime_decode_lwsp: + * @in: address of input text string + * + * Skips past any LWSP or rfc822 comments in *@in and updates @in. + **/ +void +g_mime_decode_lwsp (const char **in) +{ + const char *inptr = *in; + + while (*inptr && (*inptr == '(' || is_lwsp (*inptr))) { + while (*inptr && is_lwsp (*inptr)) + inptr++; + + /* skip over any comments */ + if (*inptr == '(') { + int depth = 1; + + inptr++; + while (*inptr && depth) { + if (*inptr == '\\' && *(inptr + 1)) + inptr++; + else if (*inptr == '(') + depth++; + else if (*inptr == ')') + depth--; + + inptr++; + } + } + } + + *in = inptr; +} + +static const char * +decode_quoted_string (const char **in) +{ + register const char *inptr = *in; + const char *qstring = NULL; + + if (*inptr == '"') { + qstring = inptr; + + inptr++; + while (*inptr && *inptr != '"') { + if (*inptr == '\\') + inptr++; + + if (*inptr) + inptr++; + } + + if (*inptr == '"') + inptr++; + + *in = inptr; + } + + return qstring; +} + +static const char * +decode_atom (const char **in) +{ + register const char *inptr = *in; + const char *atom = NULL; + + if (!is_atom (*inptr)) + return NULL; + + atom = inptr++; + while (is_atom (*inptr)) + inptr++; + + *in = inptr; + + return atom; +} + + +/** + * g_mime_decode_word: + * @in: address of input text string + * + * Extracts the next rfc822 'word' token. + * + * Returns: the next rfc822 'word' token or %NULL if non exist. + **/ +const char * +g_mime_decode_word (const char **in) +{ + const char *inptr = *in; + + decode_lwsp (&inptr); + if (*inptr == '"') { + *in = inptr; + return decode_quoted_string (in); + } else { + *in = inptr; + return decode_atom (in); + } +} + +static gboolean +decode_subliteral (const char **in, GString *domain) +{ + const char *inptr = *in; + gboolean got = FALSE; + + while (*inptr && *inptr != '.' && *inptr != ']') { + if (is_dtext (*inptr)) { + g_string_append_c (domain, *inptr); + inptr++; + got = TRUE; + } else if (is_lwsp (*inptr)) + decode_lwsp (&inptr); + else + break; + } + + *in = inptr; + + return got; +} + +static void +decode_domain_literal (const char **in, GString *domain) +{ + const char *inptr = *in; + + decode_lwsp (&inptr); + while (*inptr && *inptr != ']') { + if (decode_subliteral (&inptr, domain) && *inptr == '.') { + g_string_append_c (domain, *inptr); + inptr++; + } else if (*inptr != ']') { + w(g_warning ("Malformed domain-literal, unexpected char '%c': %s", + *inptr, *in)); + + /* try and skip to the next char ?? */ + inptr++; + } + } + + *in = inptr; +} + + +/** + * g_mime_decode_domain: + * @in: address of input text string + * @domain: a #GString to decode the domain into + * + * Extracts the next rfc822 'domain' token and appends it to @domain. + * + * Returns: %TRUE if an rfc822 'domain' token was decoded or %FALSE + * otherwise. + **/ +gboolean +g_mime_decode_domain (const char **in, GString *domain) +{ + const char *inptr, *save, *atom; + size_t initial = domain->len; + + inptr = *in; + while (inptr && *inptr) { + decode_lwsp (&inptr); + if (*inptr == '[') { + /* domain literal */ + g_string_append_c (domain, '['); + inptr++; + + decode_domain_literal (&inptr, domain); + + if (*inptr == ']') { + g_string_append_c (domain, ']'); + inptr++; + } else + w(g_warning ("Missing ']' in domain-literal: %s", *in)); + } else { + if (!(atom = decode_atom (&inptr))) { + w(g_warning ("Unexpected char '%c' in domain: %s", *inptr, *in)); + /* remove the last '.' */ + if (domain->len && domain->str[domain->len - 1] == '.') + g_string_truncate (domain, domain->len - 1); + break; + } + + g_string_append_len (domain, atom, (size_t) (inptr - atom)); + } + + save = inptr; + decode_lwsp (&inptr); + if (*inptr != '.') { + inptr = save; + break; + } + + g_string_append_c (domain, '.'); + inptr++; + } + + *in = inptr; + + return domain->len > initial; +} diff --git a/gmime/gmime-parse-utils.h b/gmime/gmime-parse-utils.h new file mode 100644 index 0000000..0bd7e19 --- /dev/null +++ b/gmime/gmime-parse-utils.h @@ -0,0 +1,40 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_PARSE_UTILS_H__ +#define __GMIME_PARSE_UTILS_H__ + +G_BEGIN_DECLS + +G_GNUC_INTERNAL gboolean g_mime_parse_content_type (const char **in, char **type, char **subtype); + +G_GNUC_INTERNAL void g_mime_decode_lwsp (const char **in); +#define decode_lwsp(in) g_mime_decode_lwsp (in) + +G_GNUC_INTERNAL const char *g_mime_decode_word (const char **in); +#define decode_word(in) g_mime_decode_word (in) + +G_GNUC_INTERNAL gboolean g_mime_decode_domain (const char **in, GString *domain); +#define decode_domain(in, domain) g_mime_decode_domain (in, domain) + +G_END_DECLS + +#endif /* __GMIME_PARSE_UTILS_H__ */ diff --git a/gmime/gmime-parser.c b/gmime/gmime-parser.c new file mode 100644 index 0000000..e278ee2 --- /dev/null +++ b/gmime/gmime-parser.c @@ -0,0 +1,2079 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gmime-parser.h" + +#include "gmime-table-private.h" +#include "gmime-message-part.h" +#include "gmime-parse-utils.h" +#include "gmime-stream-mem.h" +#include "gmime-multipart.h" +#include "gmime-common.h" +#include "gmime-part.h" + +#if GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 14) +#define HAVE_GLIB_REGEX +#elif defined (HAVE_REGEX_H) +#include +#endif + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + +#define d(x) + + +/** + * SECTION: gmime-parser + * @title: GMimeParser + * @short_description: Message and MIME part parser + * @see_also: + * + * A #GMimeParser parses a stream into a #GMimeMessage or other + * #GMimeObject and can also handle parsing MBox formatted streams + * into multiple #GMimeMessage objects. + **/ + +typedef struct _boundary_stack { + struct _boundary_stack *parent; + char *boundary; + size_t boundarylen; + size_t boundarylenfinal; + size_t boundarylenmax; + gint64 content_end; +} BoundaryStack; + +typedef struct _header_raw { + struct _header_raw *next; + char *name, *value; + gint64 offset; +} HeaderRaw; + +typedef struct _content_type { + char *type, *subtype; + gboolean exists; +} ContentType; + +extern void _g_mime_object_set_content_type (GMimeObject *object, GMimeContentType *content_type); + +static void g_mime_parser_class_init (GMimeParserClass *klass); +static void g_mime_parser_init (GMimeParser *parser, GMimeParserClass *klass); +static void g_mime_parser_finalize (GObject *object); + +static void parser_init (GMimeParser *parser, GMimeStream *stream); +static void parser_close (GMimeParser *parser); + +static GMimeObject *parser_construct_leaf_part (GMimeParser *parser, ContentType *content_type, + gboolean toplevel, int *found); +static GMimeObject *parser_construct_multipart (GMimeParser *parser, ContentType *content_type, + gboolean toplevel, int *found); + +static GObjectClass *parent_class = NULL; + +/* size of read buffer */ +#define SCAN_BUF 4096 + +/* headroom guaranteed to be before each read buffer */ +#define SCAN_HEAD 128 + +/* conservative growth sizes */ +#define HEADER_INIT_SIZE 128 +#define HEADER_RAW_INIT_SIZE 1024 + + +enum { + GMIME_PARSER_STATE_ERROR = -1, + GMIME_PARSER_STATE_INIT, + GMIME_PARSER_STATE_FROM, + GMIME_PARSER_STATE_MESSAGE_HEADERS, + GMIME_PARSER_STATE_HEADERS, + GMIME_PARSER_STATE_HEADERS_END, + GMIME_PARSER_STATE_CONTENT, + GMIME_PARSER_STATE_COMPLETE, +}; + +struct _GMimeParserPrivate { + GMimeStream *stream; + + gint64 offset; + + /* i/o buffers */ + char realbuf[SCAN_HEAD + SCAN_BUF + 1]; + char *inbuf; + char *inptr; + char *inend; + + gint64 from_offset; + GByteArray *from_line; + + GMimeParserHeaderRegexFunc header_cb; + gpointer user_data; + +#if defined (HAVE_GLIB_REGEX) + GRegex *regex; +#elif defined (HAVE_REGEX_H) + regex_t regex; +#endif + + /* header buffer */ + char *headerbuf; + char *headerptr; + size_t headerleft; + + /* raw header buffer */ + char *rawbuf; + char *rawptr; + size_t rawleft; + + /* current message headerblock offsets */ + gint64 message_headers_begin; + gint64 message_headers_end; + + /* current mime-part headerblock offsets */ + gint64 headers_begin; + gint64 headers_end; + + /* current header field offset */ + gint64 header_offset; + + short int state; + + unsigned short int unused:10; + unsigned short int midline:1; + unsigned short int seekable:1; + unsigned short int scan_from:1; + unsigned short int have_regex:1; + unsigned short int persist_stream:1; + unsigned short int respect_content_length:1; + + HeaderRaw *headers; + + BoundaryStack *bounds; +}; + +static const char MBOX_BOUNDARY[6] = "From "; +#define MBOX_BOUNDARY_LEN 5 + +static void +parser_push_boundary (GMimeParser *parser, const char *boundary) +{ + struct _GMimeParserPrivate *priv = parser->priv; + BoundaryStack *s; + size_t max; + + max = priv->bounds ? priv->bounds->boundarylenmax : 0; + + s = g_slice_new (BoundaryStack); + s->parent = priv->bounds; + priv->bounds = s; + + if (boundary == MBOX_BOUNDARY) { + s->boundary = g_strdup (boundary); + s->boundarylen = MBOX_BOUNDARY_LEN; + s->boundarylenfinal = MBOX_BOUNDARY_LEN; + } else { + s->boundary = g_strdup_printf ("--%s--", boundary); + s->boundarylen = strlen (boundary) + 2; + s->boundarylenfinal = s->boundarylen + 2; + } + + s->boundarylenmax = MAX (s->boundarylenfinal, max); + + s->content_end = -1; +} + +static void +parser_pop_boundary (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv = parser->priv; + BoundaryStack *s; + + if (!priv->bounds) { + d(g_warning ("boundary stack underflow")); + return; + } + + s = priv->bounds; + priv->bounds = priv->bounds->parent; + + g_free (s->boundary); + + g_slice_free (BoundaryStack, s); +} + +static const char * +header_raw_find (HeaderRaw *headers, const char *name, gint64 *offset) +{ + HeaderRaw *header = headers; + + while (header) { + if (!g_ascii_strcasecmp (header->name, name)) { + if (offset) + *offset = header->offset; + return header->value; + } + + header = header->next; + } + + return NULL; +} + +static void +header_raw_clear (HeaderRaw **headers) +{ + HeaderRaw *header, *next; + + header = *headers; + while (header) { + next = header->next; + g_free (header->name); + g_free (header->value); + + g_slice_free (HeaderRaw, header); + + header = next; + } + + *headers = NULL; +} + +GType +g_mime_parser_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeParserClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_parser_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeParser), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_parser_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeParser", &info, 0); + } + + return type; +} + + +static void +g_mime_parser_class_init (GMimeParserClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_parser_finalize; +} + +static void +g_mime_parser_init (GMimeParser *parser, GMimeParserClass *klass) +{ + parser->priv = g_new (struct _GMimeParserPrivate, 1); + parser->priv->respect_content_length = FALSE; + parser->priv->persist_stream = TRUE; + parser->priv->have_regex = FALSE; + parser->priv->scan_from = FALSE; + +#if defined (HAVE_GLIB_REGEX) + parser->priv->regex = NULL; +#endif + + parser_init (parser, NULL); +} + +static void +g_mime_parser_finalize (GObject *object) +{ + GMimeParser *parser = (GMimeParser *) object; + + parser_close (parser); + +#if defined (HAVE_GLIB_REGEX) + if (parser->priv->regex) + g_regex_unref (parser->priv->regex); +#elif defined (HAVE_REGEX_H) + if (parser->priv->have_regex) + regfree (&parser->priv->regex); +#endif + + g_free (parser->priv); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static void +parser_init (GMimeParser *parser, GMimeStream *stream) +{ + struct _GMimeParserPrivate *priv = parser->priv; + gint64 offset = -1; + + if (stream) { + g_object_ref (stream); + offset = g_mime_stream_tell (stream); + } + + priv->state = GMIME_PARSER_STATE_INIT; + + priv->stream = stream; + + priv->offset = offset; + + priv->inbuf = priv->realbuf + SCAN_HEAD; + priv->inptr = priv->inbuf; + priv->inend = priv->inbuf; + + priv->from_offset = -1; + priv->from_line = g_byte_array_new (); + + priv->headerbuf = g_malloc (HEADER_INIT_SIZE); + priv->headerleft = HEADER_INIT_SIZE - 1; + priv->headerptr = priv->headerbuf; + + if (offset == -1 || !priv->persist_stream) { + priv->rawbuf = g_malloc (HEADER_RAW_INIT_SIZE); + priv->rawleft = HEADER_RAW_INIT_SIZE - 1; + priv->rawptr = priv->rawbuf; + } else { + priv->rawbuf = NULL; + priv->rawptr = NULL; + priv->rawleft = 0; + } + + priv->message_headers_begin = -1; + priv->message_headers_end = -1; + + priv->headers_begin = -1; + priv->headers_end = -1; + + priv->header_offset = -1; + + priv->midline = FALSE; + priv->seekable = offset != -1; + + priv->headers = NULL; + + priv->bounds = NULL; +} + +static void +parser_close (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv = parser->priv; + + if (priv->stream) + g_object_unref (priv->stream); + + g_byte_array_free (priv->from_line, TRUE); + + g_free (priv->headerbuf); + g_free (priv->rawbuf); + + header_raw_clear (&priv->headers); + + while (priv->bounds) + parser_pop_boundary (parser); +} + + +/** + * g_mime_parser_new: + * + * Creates a new parser object. + * + * Returns: a new parser object. + **/ +GMimeParser * +g_mime_parser_new (void) +{ + return g_object_newv (GMIME_TYPE_PARSER, 0, NULL); +} + + +/** + * g_mime_parser_new_with_stream: + * @stream: raw message or part stream + * + * Creates a new parser object preset to parse @stream. + * + * Returns: a new parser object. + **/ +GMimeParser * +g_mime_parser_new_with_stream (GMimeStream *stream) +{ + GMimeParser *parser; + + parser = g_mime_parser_new (); + g_mime_parser_init_with_stream (parser, stream); + + return parser; +} + + +/** + * g_mime_parser_init_with_stream: + * @parser: a #GMimeParser context + * @stream: raw message or part stream + * + * Initializes @parser to use @stream. + * + * WARNING: Initializing a parser with a stream is comparable to + * selling your soul (@stream) to the devil (@parser). You are + * basically giving the parser complete control of the stream, this + * means that you had better not touch the stream so long as the + * parser is still using it. This means no reading, writing, seeking, + * or resetting of the stream. Anything that will/could change the + * current stream's offset is PROHIBITED. + * + * It is also recommended that you not use g_mime_stream_tell() + * because it will not necessarily give you the current @parser offset + * since @parser handles its own internal read-ahead buffer. Instead, + * it is recommended that you use g_mime_parser_tell() if you have a + * reason to need the current offset of the @parser. + **/ +void +g_mime_parser_init_with_stream (GMimeParser *parser, GMimeStream *stream) +{ + g_return_if_fail (GMIME_IS_PARSER (parser)); + g_return_if_fail (GMIME_IS_STREAM (stream)); + + parser_close (parser); + parser_init (parser, stream); +} + + +/** + * g_mime_parser_get_persist_stream: + * @parser: a #GMimeParser context + * + * Gets whether or not the underlying stream is persistent. + * + * Returns: %TRUE if the @parser will leave the content on disk or + * %FALSE if it will load the content into memory. + **/ +gboolean +g_mime_parser_get_persist_stream (GMimeParser *parser) +{ + g_return_val_if_fail (GMIME_IS_PARSER (parser), FALSE); + + return (parser->priv->persist_stream && parser->priv->seekable); +} + + +/** + * g_mime_parser_set_persist_stream: + * @parser: a #GMimeParser context + * @persist: persist attribute + * + * Sets whether or not the @parser's underlying stream is persistent. + * + * If @persist is %TRUE, the @parser will attempt to construct + * messages/parts whose content will remain on disk rather than being + * loaded into memory so as to reduce memory usage. This is the default. + * + * If @persist is %FALSE, the @parser will always load message content + * into memory. + * + * Note: This attribute only serves as a hint to the @parser. If the + * underlying stream does not support seeking, then this attribute + * will be ignored. + **/ +void +g_mime_parser_set_persist_stream (GMimeParser *parser, gboolean persist) +{ + struct _GMimeParserPrivate *priv; + + g_return_if_fail (GMIME_IS_PARSER (parser)); + + priv = parser->priv; + + if (priv->persist_stream == persist) + return; + + if (persist) { + priv->persist_stream = TRUE; + + if (priv->seekable && !priv->rawbuf) { + priv->rawbuf = g_malloc (HEADER_RAW_INIT_SIZE); + priv->rawleft = HEADER_RAW_INIT_SIZE - 1; + priv->rawptr = priv->rawbuf; + } + } else { + priv->persist_stream = FALSE; + + if (priv->rawbuf) { + g_free (priv->rawbuf); + priv->rawbuf = NULL; + priv->rawptr = NULL; + priv->rawleft = 0; + } + } +} + + +/** + * g_mime_parser_get_scan_from: + * @parser: a #GMimeParser context + * + * Gets whether or not @parser is set to scan mbox-style From-lines. + * + * Returns: whether or not @parser is set to scan mbox-style + * From-lines. + **/ +gboolean +g_mime_parser_get_scan_from (GMimeParser *parser) +{ + g_return_val_if_fail (GMIME_IS_PARSER (parser), FALSE); + + return parser->priv->scan_from; +} + + +/** + * g_mime_parser_set_scan_from: + * @parser: a #GMimeParser context + * @scan_from: %TRUE to scan From-lines or %FALSE otherwise + * + * Sets whether or not @parser should scan mbox-style From-lines. + **/ +void +g_mime_parser_set_scan_from (GMimeParser *parser, gboolean scan_from) +{ + g_return_if_fail (GMIME_IS_PARSER (parser)); + + parser->priv->scan_from = scan_from ? 1 : 0; +} + + +/** + * g_mime_parser_get_respect_content_length: + * @parser: a #GMimeParser context + * + * Gets whether or not @parser is set to use Content-Length for + * determining the offset of the end of the message. + * + * Returns: whether or not @parser is set to use Content-Length for + * determining the offset of the end of the message. + **/ +gboolean +g_mime_parser_get_respect_content_length (GMimeParser *parser) +{ + g_return_val_if_fail (GMIME_IS_PARSER (parser), FALSE); + + return parser->priv->respect_content_length; +} + + +/** + * g_mime_parser_set_respect_content_length: + * @parser: a #GMimeParser context + * @respect_content_length: %TRUE if the parser should use Content-Length headers or %FALSE otherwise. + * + * Sets whether or not @parser should respect Content-Length headers + * when deciding where to look for the start of the next message. Only + * used when the parser is also set to scan for From-lines. + * + * Most notably useful when parsing broken Solaris mbox files (See + * http://www.jwz.org/doc/content-length.html for details). + **/ +void +g_mime_parser_set_respect_content_length (GMimeParser *parser, gboolean respect_content_length) +{ + g_return_if_fail (GMIME_IS_PARSER (parser)); + + parser->priv->respect_content_length = respect_content_length ? 1 : 0; +} + + +/** + * g_mime_parser_set_header_regex: + * @parser: a #GMimeParser context + * @regex: regular expression + * @header_cb: callback function + * @user_data: user data + * + * Sets the regular expression pattern @regex on @parser. Whenever a + * header matching the pattern @regex is parsed, @header_cb is called + * with @user_data as the user_data argument. + * + * If @regex is %NULL, then the previously registered regex callback + * is unregistered and no new callback is set. + **/ +void +g_mime_parser_set_header_regex (GMimeParser *parser, const char *regex, + GMimeParserHeaderRegexFunc header_cb, gpointer user_data) +{ + struct _GMimeParserPrivate *priv; + + g_return_if_fail (GMIME_IS_PARSER (parser)); + + priv = parser->priv; + +#if defined (HAVE_GLIB_REGEX) + if (priv->regex) { + g_regex_unref (priv->regex); + priv->regex = NULL; + } +#elif defined (HAVE_REGEX_H) + if (priv->have_regex) { + regfree (&priv->regex); + priv->have_regex = FALSE; + } +#endif + + if (!regex || !header_cb) + return; + + priv->header_cb = header_cb; + priv->user_data = user_data; + +#if defined (HAVE_GLIB_REGEX) + priv->regex = g_regex_new (regex, G_REGEX_RAW | G_REGEX_EXTENDED | G_REGEX_CASELESS, 0, NULL); +#elif defined (HAVE_REGEX_H) + priv->have_regex = !regcomp (&priv->regex, regex, REG_EXTENDED | REG_ICASE | REG_NOSUB); +#endif +} + + +static ssize_t +parser_fill (GMimeParser *parser, size_t atleast) +{ + struct _GMimeParserPrivate *priv = parser->priv; + char *inbuf, *inptr, *inend; + ssize_t nread; + size_t inlen; + + inbuf = priv->inbuf; + inptr = priv->inptr; + inend = priv->inend; + inlen = inend - inptr; + + g_assert (inptr <= inend); + + if (inlen > atleast) + return inlen; + + /* attempt to align 'inend' with realbuf + SCAN_HEAD */ + if (inptr >= inbuf) { + inbuf -= inlen < SCAN_HEAD ? inlen : SCAN_HEAD; + memmove (inbuf, inptr, inlen); + inptr = inbuf; + inbuf += inlen; + } else if (inptr > priv->realbuf) { + size_t shift; + + shift = MIN (inptr - priv->realbuf, inend - inbuf); + memmove (inptr - shift, inptr, inlen); + inptr -= shift; + inbuf = inptr + inlen; + } else { + /* we can't shift... */ + inbuf = inend; + } + + priv->inptr = inptr; + priv->inend = inbuf; + inend = priv->realbuf + SCAN_HEAD + SCAN_BUF; + + if ((nread = g_mime_stream_read (priv->stream, inbuf, inend - inbuf)) > 0) { + priv->offset += nread; + priv->inend += nread; + } + + return (ssize_t) (priv->inend - priv->inptr); +} + + +static gint64 +parser_offset (struct _GMimeParserPrivate *priv, const char *inptr) +{ + if (priv->offset == -1) + return -1; + + if (!inptr) + inptr = priv->inptr; + + return (priv->offset - (priv->inend - inptr)); +} + + +/** + * g_mime_parser_tell: + * @parser: a #GMimeParser context + * + * Gets the current stream offset from the parser's internal stream. + * + * Returns: the current stream offset from the parser's internal stream + * or %-1 on error. + **/ +gint64 +g_mime_parser_tell (GMimeParser *parser) +{ + g_return_val_if_fail (GMIME_IS_PARSER (parser), -1); + g_return_val_if_fail (GMIME_IS_STREAM (parser->priv->stream), -1); + + return parser_offset (parser->priv, NULL); +} + + +/** + * g_mime_parser_eos: + * @parser: a #GMimeParser context + * + * Tests the end-of-stream indicator for @parser's internal stream. + * + * Returns: %TRUE on EOS or %FALSE otherwise. + **/ +gboolean +g_mime_parser_eos (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv; + + g_return_val_if_fail (GMIME_IS_STREAM (parser->priv->stream), TRUE); + + priv = parser->priv; + return g_mime_stream_eos (priv->stream) && priv->inptr == priv->inend; +} + +static int +parser_step_from (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv = parser->priv; + register char *inptr; + char *start, *inend; + ssize_t left = 0; + size_t len; + + g_byte_array_set_size (priv->from_line, 0); + + inptr = priv->inptr; + + g_assert (inptr <= priv->inend); + + do { + refill: + if (parser_fill (parser, MAX (SCAN_HEAD, left)) <= left) { + /* failed to find a From line; EOF reached */ + priv->state = GMIME_PARSER_STATE_ERROR; + priv->inptr = priv->inend; + return -1; + } + + inptr = priv->inptr; + inend = priv->inend; + *inend = '\n'; + + while (inptr < inend) { + start = inptr; + while (*inptr != '\n') + inptr++; + + if (inptr + 1 >= inend) { + /* we don't have enough data; if we can't get more we have to bail */ + left = (ssize_t) (inend - start); + priv->inptr = start; + goto refill; + } + + len = (size_t) (inptr - start); + inptr++; + + if (len >= 5 && !strncmp (start, "From ", 5)) { + priv->from_offset = parser_offset (priv, start); + g_byte_array_append (priv->from_line, (unsigned char *) start, len); + goto got_from; + } + } + + priv->inptr = inptr; + left = 0; + } while (1); + + got_from: + + priv->state = GMIME_PARSER_STATE_MESSAGE_HEADERS; + + priv->inptr = inptr; + + return 0; +} + +#ifdef ALLOC_NEAREST_POW2 +static inline size_t +nearest_pow (size_t num) +{ + size_t n; + + if (num == 0) + return 0; + + n = num - 1; +#if defined (__GNUC__) && defined (__i386__) + __asm__("bsrl %1,%0\n\t" + "jnz 1f\n\t" + "movl $-1,%0\n" + "1:" : "=r" (n) : "rm" (n)); + n = (1 << (n + 1)); +#else + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; +#endif + + return n; +} + +#define next_alloc_size(n) nearest_pow (n) +#else +static inline size_t +next_alloc_size (size_t n) +{ + return (n + 63) & ~63; +} +#endif + +#define header_append(priv, start, len) G_STMT_START { \ + if (priv->headerleft <= len) { \ + size_t hlen, hoff; \ + \ + hoff = priv->headerptr - priv->headerbuf; \ + hlen = next_alloc_size (hoff + len + 1); \ + \ + priv->headerbuf = g_realloc (priv->headerbuf, hlen); \ + priv->headerptr = priv->headerbuf + hoff; \ + priv->headerleft = (hlen - 1) - hoff; \ + } \ + \ + memcpy (priv->headerptr, start, len); \ + priv->headerptr += len; \ + priv->headerleft -= len; \ +} G_STMT_END + +#define raw_header_append(priv, start, len) G_STMT_START { \ + if (priv->rawbuf) { \ + if (priv->rawleft <= len) { \ + size_t hlen, hoff; \ + \ + hoff = priv->rawptr - priv->rawbuf; \ + hlen = next_alloc_size (hoff + len + 1); \ + \ + priv->rawbuf = g_realloc (priv->rawbuf, hlen); \ + priv->rawptr = priv->rawbuf + hoff; \ + priv->rawleft = (hlen - 1) - hoff; \ + } \ + \ + memcpy (priv->rawptr, start, len); \ + priv->rawptr += len; \ + priv->rawleft -= len; \ + } \ +} G_STMT_END + +#define raw_header_reset(priv) G_STMT_START { \ + if (priv->rawbuf) { \ + priv->rawleft += priv->rawptr - priv->rawbuf; \ + priv->rawptr = priv->rawbuf; \ + } \ +} G_STMT_END + +static void +header_parse (GMimeParser *parser, HeaderRaw **tail) +{ + struct _GMimeParserPrivate *priv = parser->priv; + register char *inptr; + HeaderRaw *header; + + *priv->headerptr = '\0'; + inptr = priv->headerbuf; + while (*inptr && *inptr != ':' && !is_type (*inptr, IS_SPACE | IS_CTRL)) + inptr++; + + if (*inptr != ':') { + /* ignore invalid headers */ + w(g_warning ("Invalid header at %lld: '%s'", + (long long) priv->header_offset, + priv->headerbuf)); + + priv->headerleft += priv->headerptr - priv->headerbuf; + priv->headerptr = priv->headerbuf; + + return; + } + + header = g_slice_new (HeaderRaw); + header->next = NULL; + + header->name = g_strndup (priv->headerbuf, (size_t) (inptr - priv->headerbuf)); + header->value = g_mime_strdup_trim (inptr + 1); + + header->offset = priv->header_offset; + + (*tail)->next = header; + *tail = header; + + priv->headerleft += priv->headerptr - priv->headerbuf; + priv->headerptr = priv->headerbuf; + +#if defined (HAVE_GLIB_REGEX) + if (priv->regex && g_regex_match (priv->regex, header->name, 0, NULL)) + priv->header_cb (parser, header->name, header->value, + header->offset, priv->user_data); +#elif defined (HAVE_REGEX_H) + if (priv->have_regex && + !regexec (&priv->header_regex, header->name, 0, NULL, 0)) + priv->header_cb (parser, header->name, header->value, + header->offset, priv->user_data); +#endif +} + +enum { + SUBJECT = 1 << 0, + FROM = 1 << 1, + DATE = 1 << 2, + TO = 1 << 3, + CC = 1 << 4 +}; + +static gboolean +has_message_headers (HeaderRaw *headers) +{ + unsigned int found = 0; + HeaderRaw *header; + + header = headers; + while (header != NULL) { + if (!g_ascii_strcasecmp (header->name, "Subject")) + found |= SUBJECT; + else if (!g_ascii_strcasecmp (header->name, "From")) + found |= FROM; + else if (!g_ascii_strcasecmp (header->name, "Date")) + found |= DATE; + else if (!g_ascii_strcasecmp (header->name, "To")) + found |= TO; + else if (!g_ascii_strcasecmp (header->name, "Cc")) + found |= CC; + + header = header->next; + } + + return found != 0; +} + +static gboolean +has_content_headers (HeaderRaw *headers) +{ + HeaderRaw *header; + + header = headers; + while (header != NULL) { + if (!g_ascii_strcasecmp (header->name, "Content-Type")) + return TRUE; + + header = header->next; + } + + return FALSE; +} + +static int +parser_step_headers (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv = parser->priv; + gboolean eoln, valid = TRUE, fieldname = TRUE; + gboolean continuation = FALSE; + register char *inptr; + char *start, *inend; + ssize_t left = 0; + HeaderRaw *tail; + size_t len; + + priv->midline = FALSE; + raw_header_reset (priv); + header_raw_clear (&priv->headers); + tail = (HeaderRaw *) &priv->headers; + priv->headers_begin = parser_offset (priv, NULL); + priv->header_offset = priv->headers_begin; + + inptr = priv->inptr; + inend = priv->inend; + + do { + refill: + if (parser_fill (parser, MAX (SCAN_HEAD, left)) <= left) + break; + + inptr = priv->inptr; + inend = priv->inend; + /* Note: see optimization comment [1] */ + *inend = '\n'; + + g_assert (inptr <= inend); + + while (inptr < inend) { + start = inptr; + + /* if we are scanning a new line, check for a folded header */ + if (!priv->midline && continuation && (*inptr != ' ' && *inptr != '\t')) { + header_parse (parser, &tail); + priv->header_offset = parser_offset (priv, inptr); + continuation = FALSE; + fieldname = TRUE; + valid = TRUE; + } + + eoln = inptr[0] == '\n' || (inptr[0] == '\r' && inptr[1] == '\n'); + if (fieldname && !eoln) { + /* scan and validate the field name */ + if (*inptr != ':') { + /* Note: see optimization comment [1] */ + *inend = ':'; + + while (*inptr != ':') { + if (is_type (*inptr, IS_SPACE | IS_CTRL)) { + valid = FALSE; + break; + } + + inptr++; + } + + if (inptr == inend) { + /* don't have the full field name */ + left = (ssize_t) (inend - start); + priv->inptr = start; + goto refill; + } + + /* Note: see optimization comment [1] */ + *inend = '\n'; + } else { + valid = FALSE; + } + + if (!valid) { + if (priv->scan_from && (inptr - start) == 4 + && !strncmp (start, "From ", 5)) + goto next_message; + + if (priv->headers != NULL) { + if (priv->state == GMIME_PARSER_STATE_MESSAGE_HEADERS) { + if (has_message_headers (priv->headers)) { + /* probably the start of the content, + * a broken mailer didn't terminate the + * headers with an empty line. *sigh* */ + goto content_start; + } + } else if (has_content_headers (priv->headers)) { + /* probably the start of the content, + * a broken mailer didn't terminate the + * headers with an empty line. *sigh* */ + goto content_start; + } + } else if (priv->state == GMIME_PARSER_STATE_MESSAGE_HEADERS) { + /* Be a little more strict when scanning toplevel message + * headers, but remain lenient with From-lines. */ + if ((inptr - start) != 4 || strncmp (start, "From ", 5) != 0) { + priv->state = GMIME_PARSER_STATE_ERROR; + return -1; + } + } + } + } + + fieldname = FALSE; + + /* Note: see optimization comment [1] */ + while (*inptr != '\n') + inptr++; + + len = (size_t) (inptr - start); + + if (inptr == inend) { + /* we don't have the full line, save + * what we have and refill our + * buffer... */ + if (inptr > start && inptr[-1] == '\r') { + inptr--; + len--; + } + + raw_header_append (priv, start, len); + header_append (priv, start, len); + left = (ssize_t) (inend - inptr); + priv->midline = TRUE; + priv->inptr = inptr; + goto refill; + } + + raw_header_append (priv, start, len); + + if (inptr > start && inptr[-1] == '\r') + len--; + + /* check to see if we've reached the end of the headers */ + if (!priv->midline && len == 0) + goto headers_end; + + header_append (priv, start, len); + + /* inptr has to be less than inend - 1 */ + raw_header_append (priv, "\n", 1); + priv->midline = FALSE; + continuation = TRUE; + inptr++; + } + + left = (ssize_t) (inend - inptr); + priv->inptr = inptr; + } while (1); + + inptr = priv->inptr; + inend = priv->inend; + start = inptr; + + len = (size_t) (inend - inptr); + header_append (priv, inptr, len); + raw_header_append (priv, inptr, len); + + headers_end: + + if (priv->headerptr > priv->headerbuf) + header_parse (parser, &tail); + + priv->headers_end = parser_offset (priv, start); + priv->state = GMIME_PARSER_STATE_HEADERS_END; + if (priv->rawbuf) + *priv->rawptr = '\0'; + priv->inptr = inptr; + + return 0; + + next_message: + + priv->headers_end = parser_offset (priv, start); + priv->state = GMIME_PARSER_STATE_COMPLETE; + if (priv->rawbuf) + *priv->rawptr = '\0'; + priv->inptr = start; + + return 0; + + content_start: + + priv->headers_end = parser_offset (priv, start); + priv->state = GMIME_PARSER_STATE_CONTENT; + if (priv->rawbuf) + *priv->rawptr = '\0'; + priv->inptr = start; + + return 0; +} + +static void +content_type_destroy (ContentType *content_type) +{ + g_free (content_type->subtype); + g_free (content_type->type); + + g_slice_free (ContentType, content_type); +} + +static gboolean +content_type_is_type (ContentType *content_type, const char *type, const char *subtype) +{ + if (!strcmp (type, "*") || !g_ascii_strcasecmp (content_type->type, type)) { + if (!strcmp (subtype, "*")) { + /* special case */ + return TRUE; + } + + if (!g_ascii_strcasecmp (content_type->subtype, subtype)) + return TRUE; + } + + return FALSE; +} + +static ContentType * +parser_content_type (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv = parser->priv; + ContentType *content_type; + const char *value; + + content_type = g_slice_new (ContentType); + + if (!(value = header_raw_find (priv->headers, "Content-Type", NULL)) || + !g_mime_parse_content_type (&value, &content_type->type, &content_type->subtype)) { + content_type->type = g_strdup ("text"); + content_type->subtype = g_strdup ("plain"); + } + + content_type->exists = value != NULL; + + return content_type; +} + +static int +parser_skip_line (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv = parser->priv; + register char *inptr; + char *inend; + int rv = 0; + + do { + inptr = priv->inptr; + inend = priv->inend; + *inend = '\n'; + + while (*inptr != '\n') + inptr++; + + if (inptr < inend) + break; + + priv->inptr = inptr; + + if (parser_fill (parser, SCAN_HEAD) <= 0) { + inptr = priv->inptr; + rv = -1; + break; + } + } while (1); + + priv->midline = FALSE; + + priv->inptr = MIN (inptr + 1, priv->inend); + + return rv; +} + +static int +parser_step (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv = parser->priv; + + switch (priv->state) { + case GMIME_PARSER_STATE_ERROR: + break; + case GMIME_PARSER_STATE_INIT: + priv->message_headers_begin = -1; + priv->message_headers_end = -1; + if (priv->scan_from) + priv->state = GMIME_PARSER_STATE_FROM; + else + priv->state = GMIME_PARSER_STATE_MESSAGE_HEADERS; + break; + case GMIME_PARSER_STATE_FROM: + priv->message_headers_begin = -1; + priv->message_headers_end = -1; + parser_step_from (parser); + break; + case GMIME_PARSER_STATE_MESSAGE_HEADERS: + case GMIME_PARSER_STATE_HEADERS: + parser_step_headers (parser); + + if (priv->message_headers_begin == -1) { + priv->message_headers_begin = priv->headers_begin; + priv->message_headers_end = priv->headers_end; + } + break; + case GMIME_PARSER_STATE_HEADERS_END: + if (parser_skip_line (parser) == -1) + priv->state = GMIME_PARSER_STATE_ERROR; + else + priv->state = GMIME_PARSER_STATE_CONTENT; + break; + case GMIME_PARSER_STATE_CONTENT: + break; + case GMIME_PARSER_STATE_COMPLETE: + break; + default: + g_assert_not_reached (); + break; + } + + return priv->state; +} + + +enum { + FOUND_NOTHING, + FOUND_EOS, + FOUND_BOUNDARY, + FOUND_END_BOUNDARY +}; + +#define content_save(content, start, len) G_STMT_START { \ + if (content) \ + g_byte_array_append (content, (unsigned char *) start, len); \ +} G_STMT_END + +#define possible_boundary(scan_from, start, len) \ + ((scan_from && len >= 5 && !strncmp (start, "From ", 5)) || \ + (len >= 2 && (start[0] == '-' && start[1] == '-'))) + +static int +check_boundary (struct _GMimeParserPrivate *priv, const char *start, size_t len) +{ + gint64 offset = parser_offset (priv, start); + + if (len > 0 && start[len - 1] == '\r') + len--; + + if (possible_boundary (priv->scan_from, start, len)) { + BoundaryStack *s; + + d(printf ("checking boundary '%.*s'\n", len, start)); + + s = priv->bounds; + while (s) { + /* we use >= here because From lines are > 5 chars */ + if (offset >= s->content_end && + len >= s->boundarylenfinal && + !strncmp (s->boundary, start, + s->boundarylenfinal)) { + d(printf ("found %s\n", s->content_end != -1 && offset >= s->content_end ? + "end of content" : "end boundary")); + return FOUND_END_BOUNDARY; + } + + if (len == s->boundarylen && + !strncmp (s->boundary, start, + s->boundarylen)) { + d(printf ("found boundary\n")); + return FOUND_BOUNDARY; + } + + s = s->parent; + } + + d(printf ("'%.*s' not a boundary\n", len, start)); + } + + return FOUND_NOTHING; +} + +static gboolean +found_immediate_boundary (struct _GMimeParserPrivate *priv, gboolean end) +{ + BoundaryStack *s = priv->bounds; + size_t len = end ? s->boundarylenfinal : s->boundarylen; + + return !strncmp (priv->inptr, s->boundary, len) + && (priv->inptr[len] == '\n' || priv->inptr[len] == '\r'); +} + +/* Optimization Notes: + * + * 1. By making the priv->realbuf char array 1 extra char longer, we + * can safely set '*inend' to '\n' and not fear an ABW. Setting *inend + * to '\n' means that we can eliminate having to check that inptr < + * inend every trip through our inner while-loop. This cuts the number + * of instructions down from ~7 to ~4, assuming the compiler does its + * job correctly ;-) + **/ + + +/* we add 2 for \r\n */ +#define MAX_BOUNDARY_LEN(bounds) (bounds ? bounds->boundarylenmax + 2 : 0) + +static int +parser_scan_content (GMimeParser *parser, GByteArray *content, guint *crlf) +{ + struct _GMimeParserPrivate *priv = parser->priv; + register char *inptr; + char *start, *inend; + size_t nleft, len; + size_t atleast; + int found = 0; + + d(printf ("scan-content\n")); + + priv->midline = FALSE; + + g_assert (priv->inptr <= priv->inend); + + start = inptr = priv->inptr; + + /* figure out minimum amount of data we need */ + atleast = MAX (SCAN_HEAD, MAX_BOUNDARY_LEN (priv->bounds)); + + do { + refill: + nleft = priv->inend - inptr; + if (parser_fill (parser, atleast) <= 0) { + start = priv->inptr; + found = FOUND_EOS; + break; + } + + inptr = priv->inptr; + inend = priv->inend; + /* Note: see optimization comment [1] */ + *inend = '\n'; + + len = (size_t) (inend - inptr); + if (priv->midline && len == nleft) + found = FOUND_EOS; + + priv->midline = FALSE; + + while (inptr < inend) { + start = inptr; + /* Note: see optimization comment [1] */ + while (*inptr != '\n') + inptr++; + + len = (size_t) (inptr - start); + + if (inptr < inend) { + if ((found = check_boundary (priv, start, len))) + goto boundary; + + inptr++; + len++; + } else { + /* didn't find an end-of-line */ + priv->midline = TRUE; + + if (!found) { + /* not enough to tell if we found a boundary */ + priv->inptr = start; + inptr = start; + goto refill; + } + + /* check for a boundary not ending in a \n (EOF) */ + if ((found = check_boundary (priv, start, len))) + goto boundary; + } + + content_save (content, start, len); + } + + priv->inptr = inptr; + } while (!found); + + boundary: + + /* don't chew up the boundary */ + priv->inptr = start; + + if (found != FOUND_EOS) { + if (inptr[-1] == '\r') + *crlf = 2; + else + *crlf = 1; + } else { + *crlf = 0; + } + + return found; +} + +static void +parser_scan_mime_part_content (GMimeParser *parser, GMimePart *mime_part, int *found) +{ + struct _GMimeParserPrivate *priv = parser->priv; + GMimeContentEncoding encoding; + GByteArray *content = NULL; + GMimeDataWrapper *wrapper; + GMimeStream *stream; + gint64 start, end; + guint crlf; + + g_assert (priv->state >= GMIME_PARSER_STATE_HEADERS_END); + + if (priv->persist_stream && priv->seekable) + start = parser_offset (priv, NULL); + else + content = g_byte_array_new (); + + *found = parser_scan_content (parser, content, &crlf); + if (*found != FOUND_EOS) { + /* last '\n' belongs to the boundary */ + if (priv->persist_stream && priv->seekable) + end = parser_offset (priv, NULL) - crlf; + else if (content->len > crlf) + g_byte_array_set_size (content, content->len - crlf); + else + g_byte_array_set_size (content, 0); + } else if (priv->persist_stream && priv->seekable) { + end = parser_offset (priv, NULL); + } + + encoding = g_mime_part_get_content_encoding (mime_part); + + if (priv->persist_stream && priv->seekable) + stream = g_mime_stream_substream (priv->stream, start, end); + else + stream = g_mime_stream_mem_new_with_byte_array (content); + + wrapper = g_mime_data_wrapper_new_with_stream (stream, encoding); + g_mime_part_set_content_object (mime_part, wrapper); + g_object_unref (wrapper); + g_object_unref (stream); +} + +static void +parser_scan_message_part (GMimeParser *parser, GMimeMessagePart *mpart, int *found) +{ + struct _GMimeParserPrivate *priv = parser->priv; + ContentType *content_type; + GMimeMessage *message; + GMimeObject *object; + GMimeStream *stream; + HeaderRaw *header; + + g_assert (priv->state == GMIME_PARSER_STATE_CONTENT); + + if (priv->bounds != NULL) { + /* Check for the possibility of an empty message/rfc822 part. */ + register char *inptr; + size_t atleast; + char *inend; + + /* figure out minimum amount of data we need */ + atleast = MAX (SCAN_HEAD, MAX_BOUNDARY_LEN (priv->bounds)); + + if (parser_fill (parser, atleast) <= 0) { + *found = FOUND_EOS; + return; + } + + inptr = priv->inptr; + inend = priv->inend; + /* Note: see optimization comment [1] */ + *inend = '\n'; + + while (*inptr != '\n') + inptr++; + + *found = check_boundary (priv, priv->inptr, inptr - priv->inptr); + switch (*found) { + case FOUND_END_BOUNDARY: + /* ignore "From " boundaries, boken mailers tend to include these lines... */ + if (strncmp (priv->inptr, "From ", 5) != 0) + return; + break; + case FOUND_BOUNDARY: + return; + } + } + + /* get the headers */ + priv->state = GMIME_PARSER_STATE_HEADERS; + if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) { + /* Note: currently cannot happen because + * parser_step_headers() never returns error */ + *found = FOUND_EOS; + return; + } + + message = g_mime_message_new (FALSE); + header = priv->headers; + while (header) { + if (g_ascii_strncasecmp (header->name, "Content-", 8) != 0) + g_mime_object_append_header ((GMimeObject *) message, header->name, header->value); + header = header->next; + } + + content_type = parser_content_type (parser); + if (content_type_is_type (content_type, "multipart", "*")) + object = parser_construct_multipart (parser, content_type, TRUE, found); + else + object = parser_construct_leaf_part (parser, content_type, TRUE, found); + + content_type_destroy (content_type); + message->mime_part = object; + + /* set the same raw header stream on the message's header-list */ + if ((stream = g_mime_header_list_get_stream (object->headers))) + g_mime_header_list_set_stream (((GMimeObject *) message)->headers, stream); + + g_mime_message_part_set_message (mpart, message); + g_object_unref (message); +} + +static GMimeObject * +parser_construct_leaf_part (GMimeParser *parser, ContentType *content_type, gboolean toplevel, int *found) +{ + struct _GMimeParserPrivate *priv = parser->priv; + GMimeObject *object; + GMimeStream *stream; + HeaderRaw *header; + + g_assert (priv->state >= GMIME_PARSER_STATE_HEADERS_END); + + object = g_mime_object_new_type (content_type->type, content_type->subtype); + + if (!content_type->exists) { + GMimeContentType *mime_type; + + mime_type = g_mime_content_type_new ("text", "plain"); + _g_mime_object_set_content_type (object, mime_type); + g_object_unref (mime_type); + } + + header = priv->headers; + while (header) { + if (!toplevel || !g_ascii_strncasecmp (header->name, "Content-", 8)) + g_mime_object_append_header (object, header->name, header->value); + header = header->next; + } + + header_raw_clear (&priv->headers); + + /* set the raw header stream on the header-list */ + if (priv->persist_stream && priv->seekable) + stream = g_mime_stream_substream (priv->stream, priv->headers_begin, priv->headers_end); + else + stream = g_mime_stream_mem_new_with_buffer (priv->rawbuf, priv->rawptr - priv->rawbuf); + + g_mime_header_list_set_stream (object->headers, stream); + g_object_unref (stream); + + raw_header_reset (priv); + + if (priv->state == GMIME_PARSER_STATE_HEADERS_END) { + /* skip empty line after headers */ + if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) { + *found = FOUND_EOS; + return object; + } + } + + if (GMIME_IS_MESSAGE_PART (object)) + parser_scan_message_part (parser, (GMimeMessagePart *) object, found); + else + parser_scan_mime_part_content (parser, (GMimePart *) object, found); + + return object; +} + +static void +crlf2lf (char *in) +{ + register char *inptr = in; + register char *outptr; + + while (*inptr != '\0' && !(inptr[0] == '\r' && inptr[1] == '\n')) + inptr++; + + if (*inptr == '\0') + return; + + outptr = inptr++; + + while (*inptr != '\0') { + while (*inptr != '\0' && !(inptr[0] == '\r' && inptr[1] == '\n')) + *outptr++ = *inptr++; + + if (*inptr == '\r') + inptr++; + } + + *outptr = '\0'; +} + +static int +parser_scan_multipart_face (GMimeParser *parser, GMimeMultipart *multipart, gboolean preface) +{ + GByteArray *buffer; + char *face; + guint crlf; + int found; + + buffer = g_byte_array_new (); + found = parser_scan_content (parser, buffer, &crlf); + + if (buffer->len >= crlf) { + /* last '\n' belongs to the boundary */ + g_byte_array_set_size (buffer, buffer->len + 1); + buffer->data[buffer->len - crlf - 1] = '\0'; + face = (char *) buffer->data; + crlf2lf (face); + + if (preface) + g_mime_multipart_set_preface (multipart, face); + else + g_mime_multipart_set_postface (multipart, face); + } + + g_byte_array_free (buffer, TRUE); + + return found; +} + +#define parser_scan_multipart_preface(parser, multipart) parser_scan_multipart_face (parser, multipart, TRUE) +#define parser_scan_multipart_postface(parser, multipart) parser_scan_multipart_face (parser, multipart, FALSE) + +static int +parser_scan_multipart_subparts (GMimeParser *parser, GMimeMultipart *multipart) +{ + struct _GMimeParserPrivate *priv = parser->priv; + ContentType *content_type; + GMimeObject *subpart; + int found; + + do { + /* skip over the boundary marker */ + if (parser_skip_line (parser) == -1) { + found = FOUND_EOS; + break; + } + + /* get the headers */ + priv->state = GMIME_PARSER_STATE_HEADERS; + if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) { + found = FOUND_EOS; + break; + } + + if (priv->state == GMIME_PARSER_STATE_COMPLETE && priv->headers == NULL) { + found = FOUND_END_BOUNDARY; + break; + } + + content_type = parser_content_type (parser); + if (content_type_is_type (content_type, "multipart", "*")) + subpart = parser_construct_multipart (parser, content_type, FALSE, &found); + else + subpart = parser_construct_leaf_part (parser, content_type, FALSE, &found); + + g_mime_multipart_add (multipart, subpart); + content_type_destroy (content_type); + g_object_unref (subpart); + } while (found == FOUND_BOUNDARY && found_immediate_boundary (priv, FALSE)); + + return found; +} + +static GMimeObject * +parser_construct_multipart (GMimeParser *parser, ContentType *content_type, gboolean toplevel, int *found) +{ + struct _GMimeParserPrivate *priv = parser->priv; + GMimeMultipart *multipart; + const char *boundary; + GMimeObject *object; + GMimeStream *stream; + HeaderRaw *header; + + g_assert (priv->state >= GMIME_PARSER_STATE_HEADERS_END); + + object = g_mime_object_new_type (content_type->type, content_type->subtype); + + header = priv->headers; + while (header) { + if (!toplevel || !g_ascii_strncasecmp (header->name, "Content-", 8)) + g_mime_object_append_header (object, header->name, header->value); + header = header->next; + } + + header_raw_clear (&priv->headers); + + /* set the raw header stream on the header-list */ + if (priv->persist_stream && priv->seekable) + stream = g_mime_stream_substream (priv->stream, priv->headers_begin, priv->headers_end); + else + stream = g_mime_stream_mem_new_with_buffer (priv->rawbuf, priv->rawptr - priv->rawbuf); + + g_mime_header_list_set_stream (object->headers, stream); + g_object_unref (stream); + + raw_header_reset (priv); + + multipart = (GMimeMultipart *) object; + + if (priv->state == GMIME_PARSER_STATE_HEADERS_END) { + /* skip empty line after headers */ + if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) { + *found = FOUND_EOS; + return object; + } + } + + boundary = g_mime_object_get_content_type_parameter (object, "boundary"); + if (boundary) { + parser_push_boundary (parser, boundary); + + *found = parser_scan_multipart_preface (parser, multipart); + + if (*found == FOUND_BOUNDARY) + *found = parser_scan_multipart_subparts (parser, multipart); + + if (*found == FOUND_END_BOUNDARY && found_immediate_boundary (priv, TRUE)) { + /* eat end boundary */ + parser_skip_line (parser); + parser_pop_boundary (parser); + *found = parser_scan_multipart_postface (parser, multipart); + } else { + parser_pop_boundary (parser); + } + } else { + w(g_warning ("multipart without boundary encountered")); + /* this will scan everything into the preface */ + *found = parser_scan_multipart_preface (parser, multipart); + } + + return object; +} + +static GMimeObject * +parser_construct_part (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv = parser->priv; + ContentType *content_type; + GMimeObject *object; + int found; + + /* get the headers */ + priv->state = GMIME_PARSER_STATE_HEADERS; + while (priv->state < GMIME_PARSER_STATE_HEADERS_END) { + if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) + return NULL; + } + + content_type = parser_content_type (parser); + if (content_type_is_type (content_type, "multipart", "*")) + object = parser_construct_multipart (parser, content_type, TRUE, &found); + else + object = parser_construct_leaf_part (parser, content_type, TRUE, &found); + + content_type_destroy (content_type); + + return object; +} + + +/** + * g_mime_parser_construct_part: + * @parser: a #GMimeParser context + * + * Constructs a MIME part from @parser. + * + * Returns: a MIME part based on @parser or %NULL on fail. + **/ +GMimeObject * +g_mime_parser_construct_part (GMimeParser *parser) +{ + g_return_val_if_fail (GMIME_IS_PARSER (parser), NULL); + + return parser_construct_part (parser); +} + + +static GMimeMessage * +parser_construct_message (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv = parser->priv; + unsigned long content_length = ULONG_MAX; + ContentType *content_type; + GMimeMessage *message; + GMimeObject *object; + GMimeStream *stream; + HeaderRaw *header; + char *endptr; + int found; + + /* scan the from-line if we are parsing an mbox */ + while (priv->state != GMIME_PARSER_STATE_MESSAGE_HEADERS) { + if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) + return NULL; + } + + /* parse the headers */ + while (priv->state < GMIME_PARSER_STATE_HEADERS_END) { + if (parser_step (parser) == GMIME_PARSER_STATE_ERROR) + return NULL; + } + + message = g_mime_message_new (FALSE); + header = priv->headers; + while (header) { + if (priv->respect_content_length && !g_ascii_strcasecmp (header->name, "Content-Length")) { + content_length = strtoul (header->value, &endptr, 10); + if (endptr == header->value) + content_length = ULONG_MAX; + } + + if (g_ascii_strncasecmp (header->name, "Content-", 8) != 0) + g_mime_object_append_header ((GMimeObject *) message, header->name, header->value); + header = header->next; + } + + if (priv->scan_from) { + parser_push_boundary (parser, MBOX_BOUNDARY); + if (priv->respect_content_length && content_length < ULONG_MAX) + priv->bounds->content_end = parser_offset (priv, NULL) + content_length; + } + + content_type = parser_content_type (parser); + if (content_type_is_type (content_type, "multipart", "*")) + object = parser_construct_multipart (parser, content_type, TRUE, &found); + else + object = parser_construct_leaf_part (parser, content_type, TRUE, &found); + + content_type_destroy (content_type); + message->mime_part = object; + + /* set the same raw header stream on the message's header-list */ + if ((stream = g_mime_header_list_get_stream (object->headers))) + g_mime_header_list_set_stream (((GMimeObject *) message)->headers, stream); + + if (priv->scan_from) { + priv->state = GMIME_PARSER_STATE_FROM; + parser_pop_boundary (parser); + } + + return message; +} + + +/** + * g_mime_parser_construct_message: + * @parser: a #GMimeParser context + * + * Constructs a MIME message from @parser. + * + * Returns: a MIME message or %NULL on fail. + **/ +GMimeMessage * +g_mime_parser_construct_message (GMimeParser *parser) +{ + g_return_val_if_fail (GMIME_IS_PARSER (parser), NULL); + + return parser_construct_message (parser); +} + + +/** + * g_mime_parser_get_from: + * @parser: a #GMimeParser context + * + * Gets the mbox-style From-line of the most recently parsed message + * (gotten from g_mime_parser_construct_message()). + * + * Returns: the mbox-style From-line of the most recently parsed + * message or %NULL on error. + **/ +char * +g_mime_parser_get_from (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv; + + g_return_val_if_fail (GMIME_IS_PARSER (parser), NULL); + + priv = parser->priv; + if (!priv->scan_from) + return NULL; + + if (priv->from_line->len) + return g_strndup ((char *) priv->from_line->data, priv->from_line->len); + + return NULL; +} + + +/** + * g_mime_parser_get_from_offset: + * @parser: a #GMimeParser context + * + * Gets the offset of the most recently parsed mbox-style From-line + * (gotten from g_mime_parser_construct_message()). + * + * Returns: the offset of the most recently parsed mbox-style From-line + * or %-1 on error. + **/ +gint64 +g_mime_parser_get_from_offset (GMimeParser *parser) +{ + struct _GMimeParserPrivate *priv; + + g_return_val_if_fail (GMIME_IS_PARSER (parser), -1); + + priv = parser->priv; + if (!priv->scan_from) + return -1; + + return priv->from_offset; +} + + +/** + * g_mime_parser_get_headers_begin: + * @parser: a #GMimeParser context + * + * Gets the stream offset of the beginning of the headers of the most + * recently parsed message. + * + * Returns: the offset of the beginning of the headers of the most + * recently parsed message or %-1 on error. + **/ +gint64 +g_mime_parser_get_headers_begin (GMimeParser *parser) +{ + g_return_val_if_fail (GMIME_IS_PARSER (parser), -1); + + return parser->priv->message_headers_begin; +} + + +/** + * g_mime_parser_get_headers_end: + * @parser: a #GMimeParser context + * + * Gets the stream offset of the end of the headers of the most + * recently parsed message. + * + * Returns: the offset of the end of the headers of the most recently + * parsed message or %-1 on error. + **/ +gint64 +g_mime_parser_get_headers_end (GMimeParser *parser) +{ + g_return_val_if_fail (GMIME_IS_PARSER (parser), -1); + + return parser->priv->message_headers_end; +} diff --git a/gmime/gmime-parser.h b/gmime/gmime-parser.h new file mode 100644 index 0000000..56b1fca --- /dev/null +++ b/gmime/gmime-parser.h @@ -0,0 +1,118 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_PARSER_H__ +#define __GMIME_PARSER_H__ + +#include +#include +#include + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_PARSER (g_mime_parser_get_type ()) +#define GMIME_PARSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_PARSER, GMimeParser)) +#define GMIME_PARSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_PARSER, GMimeParserClass)) +#define GMIME_IS_PARSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_PARSER)) +#define GMIME_IS_PARSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_PARSER)) +#define GMIME_PARSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_PARSER, GMimeParserClass)) + +typedef struct _GMimeParser GMimeParser; +typedef struct _GMimeParserClass GMimeParserClass; + + +/** + * GMimeParser: + * @parent_object: parent #GObject + * @priv: private parser state + * + * A MIME parser context. + **/ +struct _GMimeParser { + GObject parent_object; + + struct _GMimeParserPrivate *priv; +}; + +struct _GMimeParserClass { + GObjectClass parent_class; + +}; + + +/** + * GMimeParserHeaderRegexFunc: + * @parser: The #GMimeParser object. + * @header: The header field matched. + * @value: The header field value. + * @offset: The header field offset. + * @user_data: The user-supplied callback data. + * + * Function signature for the callback to + * g_mime_parser_set_header_regex(). + **/ +typedef void (* GMimeParserHeaderRegexFunc) (GMimeParser *parser, const char *header, + const char *value, gint64 offset, + gpointer user_data); + + +GType g_mime_parser_get_type (void); + +GMimeParser *g_mime_parser_new (void); +GMimeParser *g_mime_parser_new_with_stream (GMimeStream *stream); + +void g_mime_parser_init_with_stream (GMimeParser *parser, GMimeStream *stream); + +gboolean g_mime_parser_get_persist_stream (GMimeParser *parser); +void g_mime_parser_set_persist_stream (GMimeParser *parser, gboolean persist); + +gboolean g_mime_parser_get_scan_from (GMimeParser *parser); +void g_mime_parser_set_scan_from (GMimeParser *parser, gboolean scan_from); + +gboolean g_mime_parser_get_respect_content_length (GMimeParser *parser); +void g_mime_parser_set_respect_content_length (GMimeParser *parser, gboolean respect_content_length); + +void g_mime_parser_set_header_regex (GMimeParser *parser, const char *regex, + GMimeParserHeaderRegexFunc header_cb, + gpointer user_data); + +GMimeObject *g_mime_parser_construct_part (GMimeParser *parser); + +GMimeMessage *g_mime_parser_construct_message (GMimeParser *parser); + +gint64 g_mime_parser_tell (GMimeParser *parser); + +gboolean g_mime_parser_eos (GMimeParser *parser); + +char *g_mime_parser_get_from (GMimeParser *parser); + +gint64 g_mime_parser_get_from_offset (GMimeParser *parser); +gint64 g_mime_parser_get_headers_begin (GMimeParser *parser); +gint64 g_mime_parser_get_headers_end (GMimeParser *parser); + +G_END_DECLS + +#endif /* __GMIME_PARSER_H__ */ diff --git a/gmime/gmime-part-iter.c b/gmime/gmime-part-iter.c new file mode 100644 index 0000000..88fda83 --- /dev/null +++ b/gmime/gmime-part-iter.c @@ -0,0 +1,594 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gmime-part-iter.h" +#include "gmime-message-part.h" +#include "gmime-multipart.h" +#include "gmime-message.h" +#include "gmime-part.h" + +/** + * SECTION: gmime-part-iter + * @title: GMimePartIter + * @short_description: MIME part iterators + * @see_also: #GMimeObject + * + * #GMimePartIter is an iterator for traversing a #GMimeObject tree in + * Depth-First order. + **/ + + +typedef struct _GMimeObjectStack GMimeObjectStack; + +struct _GMimeObjectStack { + GMimeObjectStack *parent; + GMimeObject *object; + gboolean indexed; +}; + +struct _GMimePartIter { + GMimeObjectStack *parent; + GMimeObject *toplevel; + GMimeObject *current; + GArray *path; + int index; +}; + +static void +g_mime_part_iter_push (GMimePartIter *iter, GMimeObject *object, int index) +{ + GMimeObjectStack *node; + + if (index != -1) + g_array_append_val (iter->path, index); + + node = g_slice_new (GMimeObjectStack); + node->indexed = index != -1; + node->parent = iter->parent; + node->object = object; + iter->parent = node; +} + +static gboolean +g_mime_part_iter_pop (GMimePartIter *iter) +{ + GMimeObjectStack *node; + + if (!iter->parent || !iter->parent->parent) + return FALSE; + + if (iter->parent->indexed) { + iter->index = g_array_index (iter->path, int, iter->path->len - 1); + g_array_set_size (iter->path, iter->path->len - 1); + } + + iter->current = iter->parent->object; + + node = iter->parent; + iter->parent = node->parent; + g_slice_free (GMimeObjectStack, node); + + return TRUE; +} + + +/** + * g_mime_part_iter_new: + * @toplevel: a #GMimeObject to use as the toplevel + * + * Creates a new #GMimePartIter for iterating over @toplevel's subparts. + * + * Returns: a newly allocated #GMimePartIter which should be freed + * using g_mime_part_iter_free() when finished with it. + **/ +GMimePartIter * +g_mime_part_iter_new (GMimeObject *toplevel) +{ + GMimePartIter *iter; + + g_return_val_if_fail (GMIME_IS_OBJECT (toplevel), NULL); + + iter = g_slice_new (GMimePartIter); + iter->path = g_array_new (FALSE, FALSE, sizeof (int)); + iter->toplevel = toplevel; + g_object_ref (toplevel); + iter->parent = NULL; + + g_mime_part_iter_reset (iter); + + return iter; +} + + +/** + * g_mime_part_iter_free: + * @iter: a #GMimePartIter + * + * Frees the memory allocated by g_mime_part_iter_new(). + **/ +void +g_mime_part_iter_free (GMimePartIter *iter) +{ + if (iter == NULL) + return; + + g_object_unref (iter->toplevel); + g_array_free (iter->path, TRUE); + g_slice_free_chain (GMimeObjectStack, iter->parent, parent); + g_slice_free (GMimePartIter, iter); +} + + +/** + * g_mime_part_iter_reset: + * @iter: a #GMimePartIter + * + * Resets the state of @iter to its initial state. + **/ +void +g_mime_part_iter_reset (GMimePartIter *iter) +{ + g_return_if_fail (iter != NULL); + + if (GMIME_IS_MESSAGE (iter->toplevel)) + iter->current = g_mime_message_get_mime_part ((GMimeMessage *) iter->toplevel); + else + iter->current = iter->toplevel; + + g_slice_free_chain (GMimeObjectStack, iter->parent, parent); + g_array_set_size (iter->path, 0); + iter->parent = NULL; + iter->index = -1; + + /* set our initial 'current' part to our first child */ + g_mime_part_iter_next (iter); +} + + +/** + * g_mime_part_iter_jump_to: + * @iter: a #GMimePartIter + * @path: a string representing the path to jump to + * + * Updates the state of @iter to point to the #GMimeObject specified + * by @path. + * + * Returns: %TRUE if the #GMimeObject specified by @path exists or + * %FALSE otherwise. + **/ +gboolean +g_mime_part_iter_jump_to (GMimePartIter *iter, const char *path) +{ + GMimeMessagePart *message_part; + GMimeMultipart *multipart; + GMimeMessage *message; + GMimeObject *current; + GMimeObject *parent; + const char *inptr; + int index; + char *dot; + + g_return_val_if_fail (iter != NULL, FALSE); + + g_mime_part_iter_reset (iter); + + if (!path || !path[0]) + return TRUE; + + parent = iter->parent->object; + iter->current = NULL; + current = NULL; + inptr = path; + index = -1; + + while (*inptr) { + /* Note: path components are 1-based instead of 0-based */ + if ((index = strtol (inptr, &dot, 10)) <= 0 || errno == ERANGE || + index == G_MAXINT || !(*dot == '.' || *dot == '\0')) + return FALSE; + + /* normalize to a 0-based index */ + index--; + + if (GMIME_IS_MESSAGE_PART (parent)) { + message_part = (GMimeMessagePart *) parent; + if (!(message = g_mime_message_part_get_message (message_part))) + return FALSE; + + if (!(parent = g_mime_message_get_mime_part (message))) + return FALSE; + + if (!GMIME_IS_MULTIPART (parent)) + return FALSE; + + goto multipart; + } else if (GMIME_IS_MULTIPART (parent)) { + multipart: + multipart = (GMimeMultipart *) parent; + if (index >= g_mime_multipart_get_count (multipart)) + return FALSE; + + current = g_mime_multipart_get_part (multipart, index); + iter->index = index; + } else if (GMIME_IS_MESSAGE (parent)) { + message = (GMimeMessage *) parent; + if (!(current = g_mime_message_get_mime_part (message))) + return FALSE; + + iter->index = -1; + } else { + return FALSE; + } + + if (*dot == '\0') + break; + + g_mime_part_iter_push (iter, current, iter->index); + parent = current; + current = NULL; + index = -1; + + if (*dot != '.') + break; + + inptr = dot + 1; + } + + iter->current = current; + iter->index = index; + + return current != NULL; +} + + +/** + * g_mime_part_iter_is_valid: + * @iter: a #GMimePartIter + * + * Checks that the current state of @iter is valid. + * + * Returns: %TRUE if @iter is valid or %FALSE otherwise. + **/ +gboolean +g_mime_part_iter_is_valid (GMimePartIter *iter) +{ + g_return_val_if_fail (iter != NULL, FALSE); + + return iter->current != NULL; +} + + +/** + * g_mime_part_iter_next: + * @iter: a #GMimePartIter + * + * Advances to the next part in the MIME structure used to initialize + * @iter. + * + * Returns: %TRUE if successful or %FALSE otherwise. + **/ +gboolean +g_mime_part_iter_next (GMimePartIter *iter) +{ + GMimeMessagePart *message_part; + GMimeMultipart *multipart; + GMimeObject *mime_part; + GMimeMessage *message; + + if (!g_mime_part_iter_is_valid (iter)) + return FALSE; + + if (GMIME_IS_MESSAGE_PART (iter->current)) { + /* descend into our children */ + message_part = (GMimeMessagePart *) iter->current; + message = g_mime_message_part_get_message (message_part); + mime_part = message ? g_mime_message_get_mime_part (message) : NULL; + if (mime_part != NULL) { + g_mime_part_iter_push (iter, iter->current, iter->index); + iter->current = mime_part; + + if (GMIME_IS_MULTIPART (mime_part)) { + iter->index = -1; + goto multipart; + } + + iter->index = 0; + + return TRUE; + } + } else if (GMIME_IS_MULTIPART (iter->current)) { + /* descend into our children */ + multipart: + multipart = (GMimeMultipart *) iter->current; + if (g_mime_multipart_get_count (multipart) > 0) { + g_mime_part_iter_push (iter, iter->current, iter->index); + iter->current = g_mime_multipart_get_part (multipart, 0); + iter->index = 0; + return TRUE; + } + } + + /* find the next sibling */ + while (iter->parent) { + if (GMIME_IS_MULTIPART (iter->parent->object)) { + /* iterate to the next part in the multipart */ + multipart = (GMimeMultipart *) iter->parent->object; + iter->index++; + + if (g_mime_multipart_get_count (multipart) > iter->index) { + iter->current = g_mime_multipart_get_part (multipart, iter->index); + return TRUE; + } + } + + if (!g_mime_part_iter_pop (iter)) + break; + } + + iter->current = NULL; + iter->index = -1; + + return FALSE; +} + + +/** + * g_mime_part_iter_prev: + * @iter: a #GMimePartIter + * + * Rewinds to the previous part in the MIME structure used to + * initialize @iter. + * + * Returns: %TRUE if successful or %FALSE otherwise. + **/ +gboolean +g_mime_part_iter_prev (GMimePartIter *iter) +{ + GMimeMultipart *multipart; + + if (!g_mime_part_iter_is_valid (iter)) + return FALSE; + + if (iter->parent == NULL) { + iter->current = NULL; + iter->index = -1; + return FALSE; + } + + if (GMIME_IS_MULTIPART (iter->parent->object)) { + /* revert backward to the previous part in the multipart */ + multipart = (GMimeMultipart *) iter->parent->object; + iter->index--; + + if (iter->index >= 0) { + iter->current = g_mime_multipart_get_part (multipart, iter->index); + return TRUE; + } + } + + return g_mime_part_iter_pop (iter); +} + + +/** + * g_mime_part_iter_get_toplevel: + * @iter: a #GMimePartIter + * + * Gets the toplevel #GMimeObject used to initialize @iter. + * + * Returns: the toplevel #GMimeObject. + **/ +GMimeObject * +g_mime_part_iter_get_toplevel (GMimePartIter *iter) +{ + g_return_val_if_fail (iter != NULL, NULL); + + return iter->toplevel; +} + + +/** + * g_mime_part_iter_get_current: + * @iter: a #GMimePartIter + * + * Gets the #GMimeObject at the current #GMimePartIter position. + * + * Returns: the current #GMimeObject or %NULL if the state of @iter is + * invalid. + **/ +GMimeObject * +g_mime_part_iter_get_current (GMimePartIter *iter) +{ + g_return_val_if_fail (iter != NULL, NULL); + + return iter->current; +} + + +/** + * g_mime_part_iter_get_parent: + * @iter: a #GMimePartIter + * + * Gets the parent of the #GMimeObject at the current #GMimePartIter + * position. + * + * Returns: the parent #GMimeObject or %NULL if the state of @iter is + * invalid. + **/ +GMimeObject * +g_mime_part_iter_get_parent (GMimePartIter *iter) +{ + g_return_val_if_fail (iter != NULL, NULL); + + if (!g_mime_part_iter_is_valid (iter)) + return NULL; + + return iter->parent->object; +} + + +/** + * g_mime_part_iter_get_path: + * @iter: a #GMimePartIter + * + * Gets the path of the current #GMimeObject in the MIME structure + * used to initialize @iter. + * + * Returns: a newly allocated string representation of the path to the + * #GMimeObject at the current #GMimePartIter position. + **/ +char * +g_mime_part_iter_get_path (GMimePartIter *iter) +{ + GString *path; + int i, v; + + if (!g_mime_part_iter_is_valid (iter)) + return NULL; + + /* Note: path components are 1-based instead of 0-based */ + + path = g_string_new (""); + for (i = 0; i < iter->path->len; i++) { + v = g_array_index (iter->path, int, i); + g_string_append_printf (path, "%d.", v + 1); + } + + g_string_append_printf (path, "%d", iter->index + 1); + + return g_string_free (path, FALSE); +} + + +/** + * g_mime_part_iter_replace: + * @iter: a #GMimePartIter + * @replacement: a #GMimeObject + * + * Replaces the #GMimeObject at the current position with @replacement. + * + * Returns: %TRUE if the part at the current position was replaced or + * %FALSE otherwise. + **/ +gboolean +g_mime_part_iter_replace (GMimePartIter *iter, GMimeObject *replacement) +{ + GMimeMessagePart *message_part; + GMimeMessage *message; + GMimeObject *current; + GMimeObject *parent; + int index; + + g_return_val_if_fail (GMIME_IS_OBJECT (replacement), FALSE); + + if (!g_mime_part_iter_is_valid (iter)) + return FALSE; + + if (iter->current == iter->toplevel) { + g_object_unref (iter->toplevel); + iter->toplevel = replacement; + g_object_ref (replacement); + return TRUE; + } + + parent = iter->parent ? iter->parent->object : iter->toplevel; + index = iter->index; + + /* now we can safely replace the previously referenced part in its parent */ + if (GMIME_IS_MESSAGE_PART (parent)) { + /* depending on what we've been given as a + * replacement, we might replace the message in the + * message/rfc822 part or we might end up replacing + * the toplevel mime part of said message. */ + message_part = (GMimeMessagePart *) parent; + message = g_mime_message_part_get_message (message_part); + if (GMIME_IS_MESSAGE (replacement)) + g_mime_message_part_set_message (message_part, (GMimeMessage *) replacement); + else + g_mime_message_set_mime_part (message, replacement); + } else if (GMIME_IS_MULTIPART (parent)) { + current = g_mime_multipart_replace ((GMimeMultipart *) parent, index, replacement); + g_object_unref (current); + } else if (GMIME_IS_MESSAGE (parent)) { + g_mime_message_set_mime_part ((GMimeMessage *) parent, replacement); + } else { + g_assert_not_reached (); + } + + iter->current = replacement; + + return TRUE; +} + + +/** + * g_mime_part_iter_remove: + * @iter: a #GMimePartIter + * + * Removes the #GMimeObject at the current position from its + * parent. If successful, @iter is advanced to the next position + * (since the current position will become invalid). + * + * Returns: %TRUE if the part at the current position was removed or + * %FALSE otherwise. + **/ +gboolean +g_mime_part_iter_remove (GMimePartIter *iter) +{ + GMimeObject *current; + GMimeObject *parent; + int index; + + if (!g_mime_part_iter_is_valid (iter)) + return FALSE; + + if (iter->current == iter->toplevel) + return FALSE; + + parent = iter->parent ? iter->parent->object : iter->toplevel; + current = iter->current; + index = iter->index; + + /* iterate to the next part so we have something valid to refer to */ + g_mime_part_iter_next (iter); + + /* now we can safely remove the previously referenced part from its parent */ + if (GMIME_IS_MESSAGE_PART (parent)) { + g_mime_message_part_set_message ((GMimeMessagePart *) parent, NULL); + } else if (GMIME_IS_MULTIPART (parent)) { + g_mime_multipart_remove_at ((GMimeMultipart *) parent, index); + g_object_unref (current); + } else if (GMIME_IS_MESSAGE (parent)) { + g_mime_message_set_mime_part ((GMimeMessage *) parent, NULL); + } else { + g_assert_not_reached (); + } + + return TRUE; +} diff --git a/gmime/gmime-part-iter.h b/gmime/gmime-part-iter.h new file mode 100644 index 0000000..2415d77 --- /dev/null +++ b/gmime/gmime-part-iter.h @@ -0,0 +1,58 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_PART_ITER_H__ +#define __GMIME_PART_ITER_H__ + +#include + +G_BEGIN_DECLS + +/** + * GMimePartIter: + * + * A MIME part iterator. + **/ +typedef struct _GMimePartIter GMimePartIter; + +GMimePartIter *g_mime_part_iter_new (GMimeObject *toplevel); +void g_mime_part_iter_free (GMimePartIter *iter); + +void g_mime_part_iter_reset (GMimePartIter *iter); + +gboolean g_mime_part_iter_jump_to (GMimePartIter *iter, const char *path); + +gboolean g_mime_part_iter_is_valid (GMimePartIter *iter); + +gboolean g_mime_part_iter_next (GMimePartIter *iter); +gboolean g_mime_part_iter_prev (GMimePartIter *iter); + +GMimeObject *g_mime_part_iter_get_toplevel (GMimePartIter *iter); +GMimeObject *g_mime_part_iter_get_current (GMimePartIter *iter); +GMimeObject *g_mime_part_iter_get_parent (GMimePartIter *iter); +char *g_mime_part_iter_get_path (GMimePartIter *iter); + +gboolean g_mime_part_iter_replace (GMimePartIter *iter, GMimeObject *replacement); +gboolean g_mime_part_iter_remove (GMimePartIter *iter); + +G_END_DECLS + +#endif /* __GMIME_PART_ITER_H__ */ diff --git a/gmime/gmime-part.c b/gmime/gmime-part.c new file mode 100644 index 0000000..6471d62 --- /dev/null +++ b/gmime/gmime-part.c @@ -0,0 +1,898 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gmime-part.h" +#include "gmime-utils.h" +#include "gmime-common.h" +#include "gmime-stream-mem.h" +#include "gmime-stream-null.h" +#include "gmime-stream-filter.h" +#include "gmime-filter-basic.h" +#include "gmime-filter-best.h" +#include "gmime-filter-crlf.h" +#include "gmime-filter-md5.h" +#include "gmime-table-private.h" + +#define d(x) + + +/** + * SECTION: gmime-part + * @title: GMimePart + * @short_description: MIME parts + * @see_also: + * + * A #GMimePart represents any MIME leaf part (meaning it has no + * sub-parts). + **/ + +/* GObject class methods */ +static void g_mime_part_class_init (GMimePartClass *klass); +static void g_mime_part_init (GMimePart *mime_part, GMimePartClass *klass); +static void g_mime_part_finalize (GObject *object); + +/* GMimeObject class methods */ +static void mime_part_prepend_header (GMimeObject *object, const char *header, const char *value); +static void mime_part_append_header (GMimeObject *object, const char *header, const char *value); +static void mime_part_set_header (GMimeObject *object, const char *header, const char *value); +static gboolean mime_part_remove_header (GMimeObject *object, const char *header); +static ssize_t mime_part_write_to_stream (GMimeObject *object, GMimeStream *stream); +static void mime_part_encode (GMimeObject *object, GMimeEncodingConstraint constraint); + +/* GMimePart class methods */ +static void set_content_object (GMimePart *mime_part, GMimeDataWrapper *content); + + +static GMimeObjectClass *parent_class = NULL; + + +GType +g_mime_part_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimePartClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_part_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimePart), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_part_init, + }; + + type = g_type_register_static (GMIME_TYPE_OBJECT, "GMimePart", &info, 0); + } + + return type; +} + + +static void +g_mime_part_class_init (GMimePartClass *klass) +{ + GMimeObjectClass *object_class = GMIME_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_OBJECT); + + gobject_class->finalize = g_mime_part_finalize; + + object_class->prepend_header = mime_part_prepend_header; + object_class->append_header = mime_part_append_header; + object_class->remove_header = mime_part_remove_header; + object_class->set_header = mime_part_set_header; + object_class->write_to_stream = mime_part_write_to_stream; + object_class->encode = mime_part_encode; + + klass->set_content_object = set_content_object; +} + +static void +g_mime_part_init (GMimePart *mime_part, GMimePartClass *klass) +{ + mime_part->encoding = GMIME_CONTENT_ENCODING_DEFAULT; + mime_part->content_description = NULL; + mime_part->content_location = NULL; + mime_part->content_md5 = NULL; + mime_part->content = NULL; +} + +static void +g_mime_part_finalize (GObject *object) +{ + GMimePart *mime_part = (GMimePart *) object; + + g_free (mime_part->content_description); + g_free (mime_part->content_location); + g_free (mime_part->content_md5); + + if (mime_part->content) + g_object_unref (mime_part->content); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +enum { + HEADER_CONTENT_TRANSFER_ENCODING, + HEADER_CONTENT_DESCRIPTION, + HEADER_CONTENT_LOCATION, + HEADER_CONTENT_MD5, + HEADER_UNKNOWN +}; + +static const char *content_headers[] = { + "Content-Transfer-Encoding", + "Content-Description", + "Content-Location", + "Content-Md5", +}; + + +static void +copy_atom (const char *src, char *dest, size_t n) +{ + register const char *inptr = src; + register char *outptr = dest; + char *outend = dest + n; + + while (is_lwsp (*inptr)) + inptr++; + + while (is_atom (*inptr) && outptr < outend) + *outptr++ = *inptr++; + + *outptr = '\0'; +} + +static gboolean +process_header (GMimeObject *object, const char *header, const char *value) +{ + GMimePart *mime_part = (GMimePart *) object; + char encoding[32]; + guint i; + + if (g_ascii_strncasecmp (header, "Content-", 8) != 0) + return FALSE; + + for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { + if (!g_ascii_strcasecmp (content_headers[i] + 8, header + 8)) + break; + } + + switch (i) { + case HEADER_CONTENT_TRANSFER_ENCODING: + copy_atom (value, encoding, sizeof (encoding) - 1); + mime_part->encoding = g_mime_content_encoding_from_string (encoding); + break; + case HEADER_CONTENT_DESCRIPTION: + /* FIXME: we should decode this */ + g_free (mime_part->content_description); + mime_part->content_description = g_mime_strdup_trim (value); + break; + case HEADER_CONTENT_LOCATION: + g_free (mime_part->content_location); + mime_part->content_location = g_mime_strdup_trim (value); + break; + case HEADER_CONTENT_MD5: + g_free (mime_part->content_md5); + mime_part->content_md5 = g_mime_strdup_trim (value); + break; + default: + return FALSE; + } + + return TRUE; +} + +static void +mime_part_prepend_header (GMimeObject *object, const char *header, const char *value) +{ + if (!process_header (object, header, value)) + GMIME_OBJECT_CLASS (parent_class)->prepend_header (object, header, value); + else + g_mime_header_list_prepend (object->headers, header, value); +} + +static void +mime_part_append_header (GMimeObject *object, const char *header, const char *value) +{ + if (!process_header (object, header, value)) + GMIME_OBJECT_CLASS (parent_class)->append_header (object, header, value); + else + g_mime_header_list_append (object->headers, header, value); +} + +static void +mime_part_set_header (GMimeObject *object, const char *header, const char *value) +{ + if (!process_header (object, header, value)) + GMIME_OBJECT_CLASS (parent_class)->set_header (object, header, value); + else + g_mime_header_list_set (object->headers, header, value); +} + +static gboolean +mime_part_remove_header (GMimeObject *object, const char *header) +{ + GMimePart *mime_part = (GMimePart *) object; + guint i; + + if (!g_ascii_strncasecmp (header, "Content-", 8)) { + for (i = 0; i < G_N_ELEMENTS (content_headers); i++) { + if (!g_ascii_strcasecmp (content_headers[i] + 8, header + 8)) + break; + } + + switch (i) { + case HEADER_CONTENT_TRANSFER_ENCODING: + mime_part->encoding = GMIME_CONTENT_ENCODING_DEFAULT; + break; + case HEADER_CONTENT_DESCRIPTION: + g_free (mime_part->content_description); + mime_part->content_description = NULL; + break; + case HEADER_CONTENT_LOCATION: + g_free (mime_part->content_location); + mime_part->content_location = NULL; + break; + case HEADER_CONTENT_MD5: + g_free (mime_part->content_md5); + mime_part->content_md5 = NULL; + break; + default: + break; + } + } + + return GMIME_OBJECT_CLASS (parent_class)->remove_header (object, header); +} + +static ssize_t +write_content (GMimePart *part, GMimeStream *stream) +{ + ssize_t nwritten, total = 0; + + if (!part->content) + return 0; + + /* Evil Genius's "slight" optimization: Since GMimeDataWrapper::write_to_stream() + * decodes its content stream to the raw format, we can cheat by requesting its + * content stream and not doing any encoding on the data if the source and + * destination encodings are identical. + */ + + if (part->encoding != g_mime_data_wrapper_get_encoding (part->content)) { + GMimeStream *filtered_stream; + const char *filename; + GMimeFilter *filter; + + switch (part->encoding) { + case GMIME_CONTENT_ENCODING_UUENCODE: + filename = g_mime_part_get_filename (part); + nwritten = g_mime_stream_printf (stream, "begin 0644 %s\n", + filename ? filename : "unknown"); + if (nwritten == -1) + return -1; + + total += nwritten; + + /* fall thru... */ + case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: + case GMIME_CONTENT_ENCODING_BASE64: + filtered_stream = g_mime_stream_filter_new (stream); + filter = g_mime_filter_basic_new (part->encoding, TRUE); + g_mime_stream_filter_add (GMIME_STREAM_FILTER (filtered_stream), filter); + g_object_unref (filter); + break; + default: + filtered_stream = stream; + g_object_ref (stream); + break; + } + + nwritten = g_mime_data_wrapper_write_to_stream (part->content, filtered_stream); + g_mime_stream_flush (filtered_stream); + g_object_unref (filtered_stream); + + if (nwritten == -1) + return -1; + + total += nwritten; + + if (part->encoding == GMIME_CONTENT_ENCODING_UUENCODE) { + /* FIXME: get rid of this special-case x-uuencode crap */ + nwritten = g_mime_stream_write (stream, "end\n", 4); + if (nwritten == -1) + return -1; + + total += nwritten; + } + } else { + GMimeStream *content_stream; + + content_stream = g_mime_data_wrapper_get_stream (part->content); + g_mime_stream_reset (content_stream); + nwritten = g_mime_stream_write_to_stream (content_stream, stream); + + if (nwritten == -1) + return -1; + + total += nwritten; + } + + return total; +} + +static ssize_t +mime_part_write_to_stream (GMimeObject *object, GMimeStream *stream) +{ + GMimePart *mime_part = (GMimePart *) object; + ssize_t nwritten, total = 0; + + /* write the content headers */ + if ((nwritten = g_mime_header_list_write_to_stream (object->headers, stream)) == -1) + return -1; + + total += nwritten; + + /* terminate the headers */ + if (g_mime_stream_write (stream, "\n", 1) == -1) + return -1; + + total++; + + if ((nwritten = write_content (mime_part, stream)) == -1) + return -1; + + total += nwritten; + + return total; +} + +static void +mime_part_encode (GMimeObject *object, GMimeEncodingConstraint constraint) +{ + GMimePart *part = (GMimePart *) object; + GMimeContentEncoding encoding; + GMimeStream *stream, *null; + GMimeFilter *filter; + + switch (part->encoding) { + case GMIME_CONTENT_ENCODING_DEFAULT: + /* Unspecified encoding, we need to figure out the + * best encoding no matter what */ + break; + case GMIME_CONTENT_ENCODING_7BIT: + /* This encoding is always safe. */ + return; + case GMIME_CONTENT_ENCODING_8BIT: + /* This encoding is safe unless the constraint is 7bit. */ + if (constraint != GMIME_ENCODING_CONSTRAINT_7BIT) + return; + break; + case GMIME_CONTENT_ENCODING_BINARY: + /* This encoding is only safe if the constraint is binary. */ + if (constraint == GMIME_ENCODING_CONSTRAINT_BINARY) + return; + break; + case GMIME_CONTENT_ENCODING_BASE64: + case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: + case GMIME_CONTENT_ENCODING_UUENCODE: + /* These encodings are always safe. */ + return; + } + + filter = g_mime_filter_best_new (GMIME_FILTER_BEST_ENCODING); + + null = g_mime_stream_null_new (); + stream = g_mime_stream_filter_new (null); + g_mime_stream_filter_add ((GMimeStreamFilter *) stream, filter); + g_object_unref (null); + + g_mime_object_write_to_stream (object, stream); + g_object_unref (stream); + + encoding = g_mime_filter_best_encoding ((GMimeFilterBest *) filter, constraint); + g_mime_part_set_content_encoding (part, encoding); + g_object_unref (filter); +} + + +/** + * g_mime_part_new: + * + * Creates a new MIME Part object with a default content-type of + * text/plain. + * + * Returns: an empty MIME Part object with a default content-type of + * text/plain. + **/ +GMimePart * +g_mime_part_new (void) +{ + GMimeContentType *content_type; + GMimePart *mime_part; + + mime_part = g_object_newv (GMIME_TYPE_PART, 0, NULL); + + content_type = g_mime_content_type_new ("text", "plain"); + g_mime_object_set_content_type (GMIME_OBJECT (mime_part), content_type); + g_object_unref (content_type); + + return mime_part; +} + + +/** + * g_mime_part_new_with_type: + * @type: content-type string + * @subtype: content-subtype string + * + * Creates a new MIME Part with a sepcified type. + * + * Returns: an empty MIME Part object with the specified content-type. + **/ +GMimePart * +g_mime_part_new_with_type (const char *type, const char *subtype) +{ + GMimeContentType *content_type; + GMimePart *mime_part; + + mime_part = g_object_newv (GMIME_TYPE_PART, 0, NULL); + + content_type = g_mime_content_type_new (type, subtype); + g_mime_object_set_content_type (GMIME_OBJECT (mime_part), content_type); + g_object_unref (content_type); + + return mime_part; +} + + +/** + * g_mime_part_set_content_description: + * @mime_part: a #GMimePart object + * @description: content description + * + * Set the content description for the specified mime part. + **/ +void +g_mime_part_set_content_description (GMimePart *mime_part, const char *description) +{ + g_return_if_fail (GMIME_IS_PART (mime_part)); + + if (mime_part->content_description == description) + return; + + g_free (mime_part->content_description); + mime_part->content_description = g_strdup (description); + g_mime_header_list_set (GMIME_OBJECT (mime_part)->headers, "Content-Description", description); +} + + +/** + * g_mime_part_get_content_description: + * @mime_part: a #GMimePart object + * + * Gets the value of the Content-Description for the specified mime + * part if it exists or %NULL otherwise. + * + * Returns: the content description for the specified mime part. + **/ +const char * +g_mime_part_get_content_description (GMimePart *mime_part) +{ + g_return_val_if_fail (GMIME_IS_PART (mime_part), NULL); + + return mime_part->content_description; +} + + +/** + * g_mime_part_set_content_id: + * @mime_part: a #GMimePart object + * @content_id: content id + * + * Set the content id for the specified mime part. + **/ +void +g_mime_part_set_content_id (GMimePart *mime_part, const char *content_id) +{ + g_return_if_fail (GMIME_IS_PART (mime_part)); + + g_mime_object_set_content_id (GMIME_OBJECT (mime_part), content_id); +} + + +/** + * g_mime_part_get_content_id: + * @mime_part: a #GMimePart object + * + * Gets the content-id of the specified mime part if it exists, or + * %NULL otherwise. + * + * Returns: the content id for the specified mime part. + **/ +const char * +g_mime_part_get_content_id (GMimePart *mime_part) +{ + g_return_val_if_fail (GMIME_IS_PART (mime_part), NULL); + + return g_mime_object_get_content_id (GMIME_OBJECT (mime_part)); +} + + +/** + * g_mime_part_set_content_md5: + * @mime_part: a #GMimePart object + * @content_md5: content md5 or %NULL to generate the md5 digest. + * + * Set the content md5 for the specified mime part. + **/ +void +g_mime_part_set_content_md5 (GMimePart *mime_part, const char *content_md5) +{ + unsigned char digest[16], b64digest[32]; + GMimeStreamFilter *filtered_stream; + GMimeContentType *content_type; + GMimeFilter *md5_filter; + GMimeStream *stream; + guint32 save = 0; + int state = 0; + size_t len; + + g_return_if_fail (GMIME_IS_PART (mime_part)); + + g_free (mime_part->content_md5); + + if (!content_md5) { + /* compute a md5sum */ + stream = g_mime_stream_null_new (); + filtered_stream = (GMimeStreamFilter *) g_mime_stream_filter_new (stream); + g_object_unref (stream); + + content_type = g_mime_object_get_content_type ((GMimeObject *) mime_part); + if (g_mime_content_type_is_type (content_type, "text", "*")) { + GMimeFilter *crlf_filter; + + crlf_filter = g_mime_filter_crlf_new (TRUE, FALSE); + g_mime_stream_filter_add (filtered_stream, crlf_filter); + g_object_unref (crlf_filter); + } + + md5_filter = g_mime_filter_md5_new (); + g_mime_stream_filter_add (filtered_stream, md5_filter); + + stream = (GMimeStream *) filtered_stream; + g_mime_data_wrapper_write_to_stream (mime_part->content, stream); + g_object_unref (stream); + + memset (digest, 0, 16); + g_mime_filter_md5_get_digest ((GMimeFilterMd5 *) md5_filter, digest); + g_object_unref (md5_filter); + + len = g_mime_encoding_base64_encode_close (digest, 16, b64digest, &state, &save); + b64digest[len] = '\0'; + g_strstrip ((char *) b64digest); + + content_md5 = (const char *) b64digest; + } + + mime_part->content_md5 = g_strdup (content_md5); + g_mime_header_list_set (GMIME_OBJECT (mime_part)->headers, "Content-Md5", content_md5); +} + + +/** + * g_mime_part_verify_content_md5: + * @mime_part: a #GMimePart object + * + * Verify the content md5 for the specified mime part. + * + * Returns: %TRUE if the md5 is valid or %FALSE otherwise. Note: will + * return %FALSE if the mime part does not contain a Content-MD5. + **/ +gboolean +g_mime_part_verify_content_md5 (GMimePart *mime_part) +{ + unsigned char digest[16], b64digest[32]; + GMimeStreamFilter *filtered_stream; + GMimeContentType *content_type; + GMimeFilter *md5_filter; + GMimeStream *stream; + guint32 save = 0; + int state = 0; + size_t len; + + g_return_val_if_fail (GMIME_IS_PART (mime_part), FALSE); + g_return_val_if_fail (mime_part->content != NULL, FALSE); + + if (!mime_part->content_md5) + return FALSE; + + stream = g_mime_stream_null_new (); + filtered_stream = (GMimeStreamFilter *) g_mime_stream_filter_new (stream); + g_object_unref (stream); + + content_type = g_mime_object_get_content_type ((GMimeObject *) mime_part); + if (g_mime_content_type_is_type (content_type, "text", "*")) { + GMimeFilter *crlf_filter; + + crlf_filter = g_mime_filter_crlf_new (TRUE, FALSE); + g_mime_stream_filter_add (filtered_stream, crlf_filter); + g_object_unref (crlf_filter); + } + + md5_filter = g_mime_filter_md5_new (); + g_mime_stream_filter_add (filtered_stream, md5_filter); + + stream = (GMimeStream *) filtered_stream; + g_mime_data_wrapper_write_to_stream (mime_part->content, stream); + g_object_unref (stream); + + memset (digest, 0, 16); + g_mime_filter_md5_get_digest ((GMimeFilterMd5 *) md5_filter, digest); + g_object_unref (md5_filter); + + len = g_mime_encoding_base64_encode_close (digest, 16, b64digest, &state, &save); + b64digest[len] = '\0'; + g_strstrip ((char *) b64digest); + + return !strcmp ((char *) b64digest, mime_part->content_md5); +} + + +/** + * g_mime_part_get_content_md5: + * @mime_part: a #GMimePart object + * + * Gets the md5sum contained in the Content-Md5 header of the + * specified mime part if it exists, or %NULL otherwise. + * + * Returns: the content md5 for the specified mime part. + **/ +const char * +g_mime_part_get_content_md5 (GMimePart *mime_part) +{ + g_return_val_if_fail (GMIME_IS_PART (mime_part), NULL); + + return mime_part->content_md5; +} + + +/** + * g_mime_part_set_content_location: + * @mime_part: a #GMimePart object + * @content_location: content location + * + * Set the content location for the specified mime part. + **/ +void +g_mime_part_set_content_location (GMimePart *mime_part, const char *content_location) +{ + g_return_if_fail (GMIME_IS_PART (mime_part)); + + if (mime_part->content_location == content_location) + return; + + g_free (mime_part->content_location); + mime_part->content_location = g_strdup (content_location); + g_mime_header_list_set (GMIME_OBJECT (mime_part)->headers, "Content-Location", content_location); +} + + +/** + * g_mime_part_get_content_location: + * @mime_part: a #GMimePart object + * + * Gets the value of the Content-Location header if it exists, or + * %NULL otherwise. + * + * Returns: the content location for the specified mime part. + **/ +const char * +g_mime_part_get_content_location (GMimePart *mime_part) +{ + g_return_val_if_fail (GMIME_IS_PART (mime_part), NULL); + + return mime_part->content_location; +} + + +/** + * g_mime_part_set_content_encoding: + * @mime_part: a #GMimePart object + * @encoding: a #GMimeContentEncoding + * + * Set the content encoding for the specified mime part. + **/ +void +g_mime_part_set_content_encoding (GMimePart *mime_part, GMimeContentEncoding encoding) +{ + g_return_if_fail (GMIME_IS_PART (mime_part)); + + mime_part->encoding = encoding; + g_mime_header_list_set (GMIME_OBJECT (mime_part)->headers, "Content-Transfer-Encoding", + g_mime_content_encoding_to_string (encoding)); +} + + +/** + * g_mime_part_get_content_encoding: + * @mime_part: a #GMimePart object + * + * Gets the content encoding of the mime part. + * + * Returns: the content encoding for the specified mime part. + **/ +GMimeContentEncoding +g_mime_part_get_content_encoding (GMimePart *mime_part) +{ + g_return_val_if_fail (GMIME_IS_PART (mime_part), GMIME_CONTENT_ENCODING_DEFAULT); + + return mime_part->encoding; +} + + +/** + * g_mime_part_get_best_content_encoding: + * @mime_part: a #GMimePart object + * @constraint: a #GMimeEncodingConstraint + * + * Calculates the most efficient content encoding for the @mime_part + * given the @constraint. + * + * Returns: the best content encoding for the specified mime part. + **/ +GMimeContentEncoding +g_mime_part_get_best_content_encoding (GMimePart *mime_part, GMimeEncodingConstraint constraint) +{ + GMimeStream *filtered, *stream; + GMimeContentEncoding encoding; + GMimeFilterBest *best; + GMimeFilter *filter; + + g_return_val_if_fail (GMIME_IS_PART (mime_part), GMIME_CONTENT_ENCODING_DEFAULT); + + stream = g_mime_stream_null_new (); + filtered = g_mime_stream_filter_new (stream); + g_object_unref (stream); + + filter = g_mime_filter_best_new (GMIME_FILTER_BEST_ENCODING); + g_mime_stream_filter_add ((GMimeStreamFilter *) filtered, filter); + best = (GMimeFilterBest *) filter; + + g_mime_data_wrapper_write_to_stream (mime_part->content, filtered); + g_mime_stream_flush (filtered); + g_object_unref (filtered); + + encoding = g_mime_filter_best_encoding (best, constraint); + g_object_unref (best); + + return encoding; +} + + +/** + * g_mime_part_set_filename: + * @mime_part: a #GMimePart object + * @filename: the filename of the Mime Part's content + * + * Sets the "filename" parameter on the Content-Disposition and also sets the + * "name" parameter on the Content-Type. + **/ +void +g_mime_part_set_filename (GMimePart *mime_part, const char *filename) +{ + GMimeObject *object = (GMimeObject *) mime_part; + + g_return_if_fail (GMIME_IS_PART (mime_part)); + + g_mime_object_set_content_disposition_parameter (object, "filename", filename); + g_mime_object_set_content_type_parameter (object, "name", filename); +} + + +/** + * g_mime_part_get_filename: + * @mime_part: a #GMimePart object + * + * Gets the filename of the specificed mime part, or %NULL if the mime + * part does not have the filename or name parameter set. + * + * Returns: the filename of the specified MIME Part. It first checks to + * see if the "filename" parameter was set on the Content-Disposition + * and if not then checks the "name" parameter in the Content-Type. + **/ +const char * +g_mime_part_get_filename (GMimePart *mime_part) +{ + GMimeObject *object = (GMimeObject *) mime_part; + const char *filename = NULL; + + g_return_val_if_fail (GMIME_IS_PART (mime_part), NULL); + + if ((filename = g_mime_object_get_content_disposition_parameter (object, "filename"))) + return filename; + + /* check the "name" param in the content-type */ + return g_mime_object_get_content_type_parameter (object, "name"); +} + + +static void +set_content_object (GMimePart *mime_part, GMimeDataWrapper *content) +{ + if (mime_part->content) + g_object_unref (mime_part->content); + + mime_part->content = content; + g_object_ref (content); +} + + +/** + * g_mime_part_set_content_object: + * @mime_part: a #GMimePart object + * @content: a #GMimeDataWrapper content object + * + * Sets the content object on the mime part. + **/ +void +g_mime_part_set_content_object (GMimePart *mime_part, GMimeDataWrapper *content) +{ + g_return_if_fail (GMIME_IS_PART (mime_part)); + + if (mime_part->content == content) + return; + + GMIME_PART_GET_CLASS (mime_part)->set_content_object (mime_part, content); +} + + +/** + * g_mime_part_get_content_object: + * @mime_part: a #GMimePart object + * + * Gets the internal data-wrapper of the specified mime part, or %NULL + * on error. + * + * Returns: the data-wrapper for the mime part's contents. + **/ +GMimeDataWrapper * +g_mime_part_get_content_object (GMimePart *mime_part) +{ + g_return_val_if_fail (GMIME_IS_PART (mime_part), NULL); + + return mime_part->content; +} diff --git a/gmime/gmime-part.h b/gmime/gmime-part.h new file mode 100644 index 0000000..093dc27 --- /dev/null +++ b/gmime/gmime-part.h @@ -0,0 +1,107 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_PART_H__ +#define __GMIME_PART_H__ + +#include +#include + +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_PART (g_mime_part_get_type ()) +#define GMIME_PART(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_PART, GMimePart)) +#define GMIME_PART_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_PART, GMimePartClass)) +#define GMIME_IS_PART(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_PART)) +#define GMIME_IS_PART_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_PART)) +#define GMIME_PART_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_PART, GMimePartClass)) + +typedef struct _GMimePart GMimePart; +typedef struct _GMimePartClass GMimePartClass; + +/** + * GMimePart: + * @parent_object: parent #GMimeObject + * @encoding: a #GMimeContentEncoding + * @content_description: Content-Description string + * @content_location: Content-Location string + * @content_md5: Content-MD5 string + * @content: a #GMimeDataWrapper representing the MIME part's content + * + * A leaf-node MIME part object. + **/ +struct _GMimePart { + GMimeObject parent_object; + + GMimeContentEncoding encoding; + char *content_description; + char *content_location; + char *content_md5; + + GMimeDataWrapper *content; +}; + +struct _GMimePartClass { + GMimeObjectClass parent_class; + + void (* set_content_object) (GMimePart *mime_part, GMimeDataWrapper *content); +}; + + +GType g_mime_part_get_type (void); + +/* constructors */ +GMimePart *g_mime_part_new (void); +GMimePart *g_mime_part_new_with_type (const char *type, const char *subtype); + +/* accessor functions */ +void g_mime_part_set_content_description (GMimePart *mime_part, const char *description); +const char *g_mime_part_get_content_description (GMimePart *mime_part); + +void g_mime_part_set_content_id (GMimePart *mime_part, const char *content_id); +const char *g_mime_part_get_content_id (GMimePart *mime_part); + +void g_mime_part_set_content_md5 (GMimePart *mime_part, const char *content_md5); +gboolean g_mime_part_verify_content_md5 (GMimePart *mime_part); +const char *g_mime_part_get_content_md5 (GMimePart *mime_part); + +void g_mime_part_set_content_location (GMimePart *mime_part, const char *content_location); +const char *g_mime_part_get_content_location (GMimePart *mime_part); + +void g_mime_part_set_content_encoding (GMimePart *mime_part, GMimeContentEncoding encoding); +GMimeContentEncoding g_mime_part_get_content_encoding (GMimePart *mime_part); + +GMimeContentEncoding g_mime_part_get_best_content_encoding (GMimePart *mime_part, GMimeEncodingConstraint constraint); + +void g_mime_part_set_filename (GMimePart *mime_part, const char *filename); +const char *g_mime_part_get_filename (GMimePart *mime_part); + +void g_mime_part_set_content_object (GMimePart *mime_part, GMimeDataWrapper *content); +GMimeDataWrapper *g_mime_part_get_content_object (GMimePart *mime_part); + +G_END_DECLS + +#endif /* __GMIME_PART_H__ */ diff --git a/gmime/gmime-pkcs7-context.c b/gmime/gmime-pkcs7-context.c new file mode 100644 index 0000000..f371828 --- /dev/null +++ b/gmime/gmime-pkcs7-context.c @@ -0,0 +1,957 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gmime-pkcs7-context.h" +#ifdef ENABLE_SMIME +#include "gmime-filter-charset.h" +#include "gmime-stream-filter.h" +#include "gmime-stream-pipe.h" +#include "gmime-stream-mem.h" +#include "gmime-stream-fs.h" +#include "gmime-charset.h" +#endif /* ENABLE_SMIME */ +#include "gmime-error.h" + +#ifdef ENABLE_SMIME +#include +#endif + +#ifdef ENABLE_DEBUG +#define d(x) x +#else +#define d(x) +#endif + +#define _(x) x + + +/** + * SECTION: gmime-pkcs7-context + * @title: GMimePkcs7Context + * @short_description: PKCS7 crypto contexts + * @see_also: #GMimeCryptoContext + * + * A #GMimePkcs7Context is a #GMimeCryptoContext that uses GnuPG to do + * all of the encryption and digital signatures. + **/ + +typedef struct _GMimePkcs7ContextPrivate { + gboolean always_trust; +#ifdef ENABLE_SMIME + gpgme_ctx_t ctx; +#endif +} Pkcs7Ctx; + +static void g_mime_pkcs7_context_class_init (GMimePkcs7ContextClass *klass); +static void g_mime_pkcs7_context_init (GMimePkcs7Context *ctx, GMimePkcs7ContextClass *klass); +static void g_mime_pkcs7_context_finalize (GObject *object); + +static GMimeDigestAlgo pkcs7_digest_id (GMimeCryptoContext *ctx, const char *name); + +static const char *pkcs7_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest); + +static const char *pkcs7_get_signature_protocol (GMimeCryptoContext *ctx); + +static const char *pkcs7_get_encryption_protocol (GMimeCryptoContext *ctx); + +static const char *pkcs7_get_key_exchange_protocol (GMimeCryptoContext *ctx); + +static int pkcs7_sign (GMimeCryptoContext *ctx, const char *userid, + GMimeDigestAlgo digest, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +static GMimeSignatureList *pkcs7_verify (GMimeCryptoContext *ctx, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *sigstream, + GError **err); + +static int pkcs7_encrypt (GMimeCryptoContext *ctx, gboolean sign, const char *userid, + GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +static GMimeDecryptResult *pkcs7_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream, + GMimeStream *ostream, GError **err); + +static int pkcs7_import_keys (GMimeCryptoContext *ctx, GMimeStream *istream, + GError **err); + +static int pkcs7_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys, + GMimeStream *ostream, GError **err); + + +static GMimeCryptoContextClass *parent_class = NULL; + + +GType +g_mime_pkcs7_context_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimePkcs7ContextClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_pkcs7_context_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimePkcs7Context), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_pkcs7_context_init, + }; + + type = g_type_register_static (GMIME_TYPE_CRYPTO_CONTEXT, "GMimePkcs7Context", &info, 0); + } + + return type; +} + + +static void +g_mime_pkcs7_context_class_init (GMimePkcs7ContextClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GMimeCryptoContextClass *crypto_class = GMIME_CRYPTO_CONTEXT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_pkcs7_context_finalize; + + crypto_class->digest_id = pkcs7_digest_id; + crypto_class->digest_name = pkcs7_digest_name; + crypto_class->sign = pkcs7_sign; + crypto_class->verify = pkcs7_verify; + crypto_class->encrypt = pkcs7_encrypt; + crypto_class->decrypt = pkcs7_decrypt; + crypto_class->import_keys = pkcs7_import_keys; + crypto_class->export_keys = pkcs7_export_keys; + crypto_class->get_signature_protocol = pkcs7_get_signature_protocol; + crypto_class->get_encryption_protocol = pkcs7_get_encryption_protocol; + crypto_class->get_key_exchange_protocol = pkcs7_get_key_exchange_protocol; +} + +static void +g_mime_pkcs7_context_init (GMimePkcs7Context *ctx, GMimePkcs7ContextClass *klass) +{ + ctx->priv = g_slice_new (Pkcs7Ctx); + ctx->priv->always_trust = FALSE; +#ifdef ENABLE_SMIME + ctx->priv->ctx = NULL; +#endif +} + +static void +g_mime_pkcs7_context_finalize (GObject *object) +{ + GMimePkcs7Context *ctx = (GMimePkcs7Context *) object; + +#ifdef ENABLE_SMIME + if (ctx->priv->ctx) + gpgme_release (ctx->priv->ctx); +#endif + + g_slice_free (Pkcs7Ctx, ctx->priv); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GMimeDigestAlgo +pkcs7_digest_id (GMimeCryptoContext *ctx, const char *name) +{ + if (name == NULL) + return GMIME_DIGEST_ALGO_DEFAULT; + + if (!g_ascii_strcasecmp (name, "md2")) + return GMIME_DIGEST_ALGO_MD2; + else if (!g_ascii_strcasecmp (name, "md4")) + return GMIME_DIGEST_ALGO_MD4; + else if (!g_ascii_strcasecmp (name, "md5")) + return GMIME_DIGEST_ALGO_MD5; + else if (!g_ascii_strcasecmp (name, "sha1")) + return GMIME_DIGEST_ALGO_SHA1; + else if (!g_ascii_strcasecmp (name, "sha224")) + return GMIME_DIGEST_ALGO_SHA224; + else if (!g_ascii_strcasecmp (name, "sha256")) + return GMIME_DIGEST_ALGO_SHA256; + else if (!g_ascii_strcasecmp (name, "sha384")) + return GMIME_DIGEST_ALGO_SHA384; + else if (!g_ascii_strcasecmp (name, "sha512")) + return GMIME_DIGEST_ALGO_SHA512; + else if (!g_ascii_strcasecmp (name, "ripemd160")) + return GMIME_DIGEST_ALGO_RIPEMD160; + else if (!g_ascii_strcasecmp (name, "tiger192")) + return GMIME_DIGEST_ALGO_TIGER192; + else if (!g_ascii_strcasecmp (name, "haval-5-160")) + return GMIME_DIGEST_ALGO_HAVAL5160; + + return GMIME_DIGEST_ALGO_DEFAULT; +} + +static const char * +pkcs7_digest_name (GMimeCryptoContext *ctx, GMimeDigestAlgo digest) +{ + switch (digest) { + case GMIME_DIGEST_ALGO_MD2: + return "md2"; + case GMIME_DIGEST_ALGO_MD4: + return "md4"; + case GMIME_DIGEST_ALGO_MD5: + return "md5"; + case GMIME_DIGEST_ALGO_SHA1: + return "sha1"; + case GMIME_DIGEST_ALGO_SHA224: + return "sha224"; + case GMIME_DIGEST_ALGO_SHA256: + return "sha256"; + case GMIME_DIGEST_ALGO_SHA384: + return "sha384"; + case GMIME_DIGEST_ALGO_SHA512: + return "sha512"; + case GMIME_DIGEST_ALGO_RIPEMD160: + return "ripemd160"; + case GMIME_DIGEST_ALGO_TIGER192: + return "tiger192"; + case GMIME_DIGEST_ALGO_HAVAL5160: + return "haval-5-160"; + default: + return "sha1"; + } +} + +static const char * +pkcs7_get_signature_protocol (GMimeCryptoContext *ctx) +{ + return "application/pkcs7-signature"; +} + +static const char * +pkcs7_get_encryption_protocol (GMimeCryptoContext *ctx) +{ + return "application/pkcs7-mime"; +} + +static const char * +pkcs7_get_key_exchange_protocol (GMimeCryptoContext *ctx) +{ + return "application/pkcs7-keys"; +} + +#ifdef ENABLE_SMIME +static gpgme_error_t +pkcs7_passphrase_cb (void *hook, const char *uid_hint, const char *passphrase_info, int prev_was_bad, int fd) +{ + GMimeCryptoContext *context = (GMimeCryptoContext *) hook; + GMimeStream *stream; + gpgme_error_t error; + GError *err = NULL; + gboolean rv; + + if (context->request_passwd) { + stream = g_mime_stream_pipe_new (fd); + rv = context->request_passwd (context, uid_hint, passphrase_info, prev_was_bad, stream, &err); + g_object_unref (stream); + } else { + return GPG_ERR_GENERAL; + } + + if (!rv) { + error = GPG_ERR_CANCELED; + g_error_free (err); + } else { + error = GPG_ERR_NO_ERROR; + } + + return error; +} + +static ssize_t +pkcs7_stream_read (void *stream, void *buffer, size_t size) +{ + return g_mime_stream_read ((GMimeStream *) stream, (char *) buffer, size); +} + +static ssize_t +pkcs7_stream_write (void *stream, const void *buffer, size_t size) +{ + return g_mime_stream_write ((GMimeStream *) stream, (const char *) buffer, size); +} + +static off_t +pkcs7_stream_seek (void *stream, off_t offset, int whence) +{ + switch (whence) { + case SEEK_SET: + return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_SET); + case SEEK_CUR: + return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_CUR); + case SEEK_END: + return (off_t) g_mime_stream_seek ((GMimeStream *) stream, (gint64) offset, GMIME_STREAM_SEEK_END); + default: + return -1; + } +} + +static void +pkcs7_stream_free (void *stream) +{ + /* no-op */ +} + +static struct gpgme_data_cbs pkcs7_stream_funcs = { + pkcs7_stream_read, + pkcs7_stream_write, + pkcs7_stream_seek, + pkcs7_stream_free +}; + + + +#define KEY_IS_OK(k) (!((k)->expired || (k)->revoked || \ + (k)->disabled || (k)->invalid)) + +static gpgme_key_t +pkcs7_get_key_by_name (Pkcs7Ctx *pkcs7, const char *name, gboolean secret, GError **err) +{ + time_t now = time (NULL); + gpgme_key_t key = NULL; + gpgme_subkey_t subkey; + gboolean bad = FALSE; + gpgme_error_t error; + int errval = 0; + + if ((error = gpgme_op_keylist_start (pkcs7->ctx, name, secret)) != GPG_ERR_NO_ERROR) { + if (secret) + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not list secret keys for \"%s\""), name); + else + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not list keys for \"%s\""), name); + return NULL; + } + + while ((error = gpgme_op_keylist_next (pkcs7->ctx, &key)) == GPG_ERR_NO_ERROR) { + /* check if this key and the relevant subkey are usable */ + if (KEY_IS_OK (key)) { + subkey = key->subkeys; + + while (subkey && ((secret && !subkey->can_sign) || + (!secret && !subkey->can_encrypt))) + subkey = subkey->next; + + if (subkey && KEY_IS_OK (subkey) && + (subkey->expires == 0 || subkey->expires > now)) + break; + + if (subkey->expired) + errval = GPG_ERR_KEY_EXPIRED; + else + errval = GPG_ERR_BAD_KEY; + } else { + if (key->expired) + errval = GPG_ERR_KEY_EXPIRED; + else + errval = GPG_ERR_BAD_KEY; + } + + gpgme_key_unref (key); + bad = TRUE; + key = NULL; + } + + gpgme_op_keylist_end (pkcs7->ctx); + + if (error != GPG_ERR_NO_ERROR && error != GPG_ERR_EOF) { + if (secret) + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not list secret keys for \"%s\""), name); + else + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not list keys for \"%s\""), name); + + return NULL; + } + + if (!key) { + if (strchr (name, '@')) { + if (bad) + g_set_error (err, GMIME_GPGME_ERROR, errval, + _("A key for %s is present, but it is expired, disabled, revoked or invalid"), + name); + else + g_set_error (err, GMIME_GPGME_ERROR, GPG_ERR_NOT_FOUND, + _("Could not find a key for %s"), name); + } else { + if (bad) + g_set_error (err, GMIME_GPGME_ERROR, errval, + _("A key with id %s is present, but it is expired, disabled, revoked or invalid"), + name); + else + g_set_error (err, GMIME_GPGME_ERROR, GPG_ERR_NOT_FOUND, + _("Could not find a key with id %s"), name); + } + + return NULL; + } + + return key; +} + +static gboolean +pkcs7_add_signer (Pkcs7Ctx *pkcs7, const char *signer, GError **err) +{ + gpgme_key_t key = NULL; + + if (!(key = pkcs7_get_key_by_name (pkcs7, signer, TRUE, err))) + return FALSE; + + /* set the key (the previous operation guaranteed that it exists, no need + * 2 check return values...) */ + gpgme_signers_add (pkcs7->ctx, key); + gpgme_key_unref (key); + + return TRUE; +} +#endif /* ENABLE_SMIME */ + +static int +pkcs7_sign (GMimeCryptoContext *context, const char *userid, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *ostream, GError **err) +{ +#ifdef ENABLE_SMIME + GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; + Pkcs7Ctx *pkcs7 = ctx->priv; + gpgme_sign_result_t result; + gpgme_data_t input, output; + gpgme_error_t error; + + if (!pkcs7_add_signer (pkcs7, userid, err)) + return -1; + + gpgme_set_armor (pkcs7->ctx, FALSE); + + if ((error = gpgme_data_new_from_cbs (&input, &pkcs7_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream")); + return -1; + } + + if ((error = gpgme_data_new_from_cbs (&output, &pkcs7_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream")); + gpgme_data_release (input); + return -1; + } + + /* sign the input stream */ + if ((error = gpgme_op_sign (pkcs7->ctx, input, output, GPGME_SIG_MODE_DETACH)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Signing failed")); + gpgme_data_release (output); + gpgme_data_release (input); + return -1; + } + + gpgme_data_release (output); + gpgme_data_release (input); + + /* return the digest algorithm used for signing */ + result = gpgme_op_sign_result (pkcs7->ctx); + + return pkcs7_digest_id (context, gpgme_hash_algo_name (result->signatures->hash_algo)); +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + + return -1; +#endif /* ENABLE_SMIME */ +} + +#ifdef ENABLE_SMIME +static GMimeCertificateTrust +pkcs7_trust (gpgme_validity_t trust) +{ + switch (trust) { + case GPGME_VALIDITY_UNKNOWN: + default: + return GMIME_CERTIFICATE_TRUST_NONE; + case GPGME_VALIDITY_UNDEFINED: + return GMIME_CERTIFICATE_TRUST_UNDEFINED; + case GPGME_VALIDITY_NEVER: + return GMIME_CERTIFICATE_TRUST_NEVER; + case GPGME_VALIDITY_MARGINAL: + return GMIME_CERTIFICATE_TRUST_MARGINAL; + case GPGME_VALIDITY_FULL: + return GMIME_CERTIFICATE_TRUST_FULLY; + case GPGME_VALIDITY_ULTIMATE: + return GMIME_CERTIFICATE_TRUST_ULTIMATE; + } +} + +static GMimeSignatureList * +pkcs7_get_signatures (Pkcs7Ctx *pkcs7, gboolean verify) +{ + GMimeSignatureList *signatures; + GMimeSignature *signature; + gpgme_verify_result_t result; + gpgme_subkey_t subkey; + gpgme_signature_t sig; + gpgme_user_id_t uid; + gpgme_key_t key; + + /* get the signature verification results from GpgMe */ + if (!(result = gpgme_op_verify_result (pkcs7->ctx)) || !result->signatures) + return verify ? g_mime_signature_list_new () : NULL; + + /* create a new signature list to return */ + signatures = g_mime_signature_list_new (); + + sig = result->signatures; + + while (sig != NULL) { + signature = g_mime_signature_new (); + g_mime_signature_list_add (signatures, signature); + + if (sig->status != GPG_ERR_NO_ERROR) + g_mime_signature_set_status (signature, GMIME_SIGNATURE_STATUS_ERROR); + else + g_mime_signature_set_status (signature, GMIME_SIGNATURE_STATUS_GOOD); + + g_mime_certificate_set_pubkey_algo (signature->cert, sig->pubkey_algo); + g_mime_certificate_set_digest_algo (signature->cert, sig->hash_algo); + g_mime_certificate_set_fingerprint (signature->cert, sig->fpr); + g_mime_signature_set_expires (signature, sig->exp_timestamp); + g_mime_signature_set_created (signature, sig->timestamp); + + if (sig->exp_timestamp != 0 && sig->exp_timestamp <= time (NULL)) { + /* signature expired, automatically results in a BAD signature */ + signature->errors |= GMIME_SIGNATURE_ERROR_EXPSIG; + signature->status = GMIME_SIGNATURE_STATUS_BAD; + } + + if (gpgme_get_key (pkcs7->ctx, sig->fpr, &key, 0) == GPG_ERR_NO_ERROR && key) { + /* get more signer info from their signing key */ + g_mime_certificate_set_trust (signature->cert, pkcs7_trust (key->owner_trust)); + g_mime_certificate_set_issuer_serial (signature->cert, key->issuer_serial); + g_mime_certificate_set_issuer_name (signature->cert, key->issuer_name); + + /* get the keyid, name, and email address */ + uid = key->uids; + while (uid) { + if (uid->name && *uid->name) + g_mime_certificate_set_name (signature->cert, uid->name); + + if (uid->email && *uid->email) + g_mime_certificate_set_email (signature->cert, uid->email); + + if (uid->uid && *uid->uid) + g_mime_certificate_set_key_id (signature->cert, uid->uid); + + if (signature->cert->name && signature->cert->email && signature->cert->keyid) + break; + + uid = uid->next; + } + + /* get the subkey used for signing */ + subkey = key->subkeys; + while (subkey && !subkey->can_sign) + subkey = subkey->next; + + if (subkey) { + g_mime_certificate_set_created (signature->cert, subkey->timestamp); + g_mime_certificate_set_expires (signature->cert, subkey->expires); + + if (subkey->revoked) { + /* signer's key has been revoked, automatic BAD status */ + signature->errors |= GMIME_SIGNATURE_ERROR_REVKEYSIG; + signature->status = GMIME_SIGNATURE_STATUS_BAD; + } + + if (subkey->expired) { + /* signer's key has expired, automatic BAD status */ + signature->errors |= GMIME_SIGNATURE_ERROR_EXPKEYSIG; + signature->status = GMIME_SIGNATURE_STATUS_BAD; + } + } else { + /* If we don't have the subkey used by the signer, then we can't + * tell what the status is, so set to ERROR if it hasn't already + * been designated as BAD. */ + if (signature->status != GMIME_SIGNATURE_STATUS_BAD) + signature->status = GMIME_SIGNATURE_STATUS_ERROR; + signature->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY; + } + + gpgme_key_unref (key); + } else { + /* If we don't have the signer's public key, then we can't tell what + * the status is, so set it to ERROR if it hasn't already been + * designated as BAD. */ + g_mime_certificate_set_trust (signature->cert, GMIME_CERTIFICATE_TRUST_UNDEFINED); + if (signature->status != GMIME_SIGNATURE_STATUS_BAD) + signature->status = GMIME_SIGNATURE_STATUS_ERROR; + signature->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY; + } + + sig = sig->next; + } + + return signatures; +} +#endif /* ENABLE_SMIME */ + +static GMimeSignatureList * +pkcs7_verify (GMimeCryptoContext *context, GMimeDigestAlgo digest, + GMimeStream *istream, GMimeStream *sigstream, + GError **err) +{ +#ifdef ENABLE_SMIME + GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; + gpgme_data_t message, signature; + Pkcs7Ctx *pkcs7 = ctx->priv; + gpgme_error_t error; + + if ((error = gpgme_data_new_from_cbs (&message, &pkcs7_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream")); + return NULL; + } + + /* if @sigstream is non-NULL, then it is a detached signature */ + if (sigstream != NULL) { + if ((error = gpgme_data_new_from_cbs (&signature, &pkcs7_stream_funcs, sigstream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open signature stream")); + gpgme_data_release (message); + return NULL; + } + } else { + signature = NULL; + } + + if ((error = gpgme_op_verify (pkcs7->ctx, signature, message, NULL)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not verify pkcs7 signature")); + if (signature) + gpgme_data_release (signature); + gpgme_data_release (message); + return NULL; + } + + if (signature) + gpgme_data_release (signature); + + if (message) + gpgme_data_release (message); + + /* get/return the pkcs7 signatures */ + return pkcs7_get_signatures (pkcs7, TRUE); +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + + return NULL; +#endif /* ENABLE_SMIME */ +} + +#ifdef ENABLE_SMIME +static void +key_list_free (gpgme_key_t *keys) +{ + gpgme_key_t *key = keys; + + while (key != NULL) { + gpgme_key_unref (*key); + key++; + } + + g_free (keys); +} +#endif /* ENABLE_SMIME */ + +static int +pkcs7_encrypt (GMimeCryptoContext *context, gboolean sign, const char *userid, + GMimeDigestAlgo digest, GPtrArray *recipients, GMimeStream *istream, + GMimeStream *ostream, GError **err) +{ +#ifdef ENABLE_SMIME + GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; + Pkcs7Ctx *pkcs7 = ctx->priv; + gpgme_data_t input, output; + gpgme_error_t error; + gpgme_key_t *rcpts; + gpgme_key_t key; + guint i; + + if (sign) { + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, + _("Cannot sign and encrypt a stream at the same time using pkcs7")); + return -1; + } + + /* create an array of recipient keys for GpgMe */ + rcpts = g_new0 (gpgme_key_t, recipients->len + 1); + for (i = 0; i < recipients->len; i++) { + if (!(key = pkcs7_get_key_by_name (pkcs7, recipients->pdata[i], FALSE, err))) { + key_list_free (rcpts); + return -1; + } + + rcpts[i] = key; + } + + if ((error = gpgme_data_new_from_cbs (&input, &pkcs7_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream")); + key_list_free (rcpts); + return -1; + } + + if ((error = gpgme_data_new_from_cbs (&output, &pkcs7_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream")); + gpgme_data_release (input); + key_list_free (rcpts); + return -1; + } + + /* encrypt the input stream */ + error = gpgme_op_encrypt (pkcs7->ctx, rcpts, GPGME_ENCRYPT_ALWAYS_TRUST, input, output); + gpgme_data_release (output); + gpgme_data_release (input); + key_list_free (rcpts); + + if (error != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Encryption failed")); + return -1; + } + + return 0; +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + + return -1; +#endif /* ENABLE_SMIME */ +} + +#ifdef ENABLE_SMIME +static GMimeDecryptResult * +pkcs7_get_decrypt_result (Pkcs7Ctx *pkcs7) +{ + GMimeDecryptResult *result; + gpgme_decrypt_result_t res; + gpgme_recipient_t recipient; + GMimeCertificate *cert; + + result = g_mime_decrypt_result_new (); + result->recipients = g_mime_certificate_list_new (); + result->signatures = pkcs7_get_signatures (pkcs7, FALSE); + + if (!(res = gpgme_op_decrypt_result (pkcs7->ctx)) || !res->recipients) + return result; + + recipient = res->recipients; + while (recipient != NULL) { + cert = g_mime_certificate_new (); + g_mime_certificate_list_add (result->recipients, cert); + + g_mime_certificate_set_pubkey_algo (cert, recipient->pubkey_algo); + g_mime_certificate_set_key_id (cert, recipient->keyid); + + recipient = recipient->next; + } + + return result; +} +#endif /* ENABLE_SMIME */ + +static GMimeDecryptResult * +pkcs7_decrypt (GMimeCryptoContext *context, GMimeStream *istream, + GMimeStream *ostream, GError **err) +{ +#ifdef ENABLE_SMIME + GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; + GMimeDecryptResult *result; + Pkcs7Ctx *pkcs7 = ctx->priv; + gpgme_decrypt_result_t res; + gpgme_data_t input, output; + gpgme_error_t error; + + if ((error = gpgme_data_new_from_cbs (&input, &pkcs7_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream")); + return NULL; + } + + if ((error = gpgme_data_new_from_cbs (&output, &pkcs7_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream")); + gpgme_data_release (input); + return NULL; + } + + /* decrypt the input stream */ + if ((error = gpgme_op_decrypt_verify (pkcs7->ctx, input, output)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Decryption failed")); + gpgme_data_release (output); + gpgme_data_release (input); + return NULL; + } + + gpgme_data_release (output); + gpgme_data_release (input); + + return pkcs7_get_decrypt_result (pkcs7); +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + + return NULL; +#endif /* ENABLE_SMIME */ +} + +static int +pkcs7_import_keys (GMimeCryptoContext *context, GMimeStream *istream, GError **err) +{ +#ifdef ENABLE_SMIME + GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; + Pkcs7Ctx *pkcs7 = ctx->priv; + gpgme_data_t keydata; + gpgme_error_t error; + + if ((error = gpgme_data_new_from_cbs (&keydata, &pkcs7_stream_funcs, istream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream")); + return -1; + } + + /* import the key(s) */ + if ((error = gpgme_op_import (pkcs7->ctx, keydata)) != GPG_ERR_NO_ERROR) { + //printf ("import error (%d): %s\n", error & GPG_ERR_CODE_MASK, gpg_strerror (error)); + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not import key data")); + gpgme_data_release (keydata); + return -1; + } + + gpgme_data_release (keydata); + + return 0; +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + + return -1; +#endif /* ENABLE_SMIME */ +} + +static int +pkcs7_export_keys (GMimeCryptoContext *context, GPtrArray *keys, GMimeStream *ostream, GError **err) +{ +#ifdef ENABLE_SMIME + GMimePkcs7Context *ctx = (GMimePkcs7Context *) context; + Pkcs7Ctx *pkcs7 = ctx->priv; + gpgme_data_t keydata; + gpgme_error_t error; + guint i; + + if ((error = gpgme_data_new_from_cbs (&keydata, &pkcs7_stream_funcs, ostream)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open output stream")); + return -1; + } + + /* export the key(s) */ + for (i = 0; i < keys->len; i++) { + if ((error = gpgme_op_export (pkcs7->ctx, keys->pdata[i], 0, keydata)) != GPG_ERR_NO_ERROR) { + g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not export key data")); + gpgme_data_release (keydata); + return -1; + } + } + + gpgme_data_release (keydata); + + return 0; +#else + g_set_error (err, GMIME_ERROR, GMIME_ERROR_NOT_SUPPORTED, _("S/MIME support is not enabled in this build")); + + return -1; +#endif /* ENABLE_SMIME */ +} + + +/** + * g_mime_pkcs7_context_new: + * @request_passwd: a #GMimePasswordRequestFunc + * + * Creates a new pkcs7 crypto context object. + * + * Returns: a new pkcs7 crypto context object. + **/ +GMimeCryptoContext * +g_mime_pkcs7_context_new (GMimePasswordRequestFunc request_passwd) +{ +#ifdef ENABLE_SMIME + GMimeCryptoContext *crypto; + GMimePkcs7Context *pkcs7; + gpgme_ctx_t ctx; + + /* make sure GpgMe supports the CMS protocols */ + if (gpgme_engine_check_version (GPGME_PROTOCOL_CMS) != GPG_ERR_NO_ERROR) + return NULL; + + /* create the GpgMe context */ + if (gpgme_new (&ctx) != GPG_ERR_NO_ERROR) + return NULL; + + pkcs7 = g_object_newv (GMIME_TYPE_PKCS7_CONTEXT, 0, NULL); + gpgme_set_passphrase_cb (ctx, pkcs7_passphrase_cb, pkcs7); + gpgme_set_protocol (ctx, GPGME_PROTOCOL_CMS); + pkcs7->priv->ctx = ctx; + + crypto = (GMimeCryptoContext *) pkcs7; + crypto->request_passwd = request_passwd; + + return crypto; +#else + return NULL; +#endif /* ENABLE_SMIME */ +} + + +/** + * g_mime_pkcs7_context_get_always_trust: + * @ctx: a #GMimePkcs7Context + * + * Gets the @always_trust flag on the pkcs7 context. + * + * Returns: the @always_trust flag on the pkcs7 context. + **/ +gboolean +g_mime_pkcs7_context_get_always_trust (GMimePkcs7Context *ctx) +{ + g_return_val_if_fail (GMIME_IS_PKCS7_CONTEXT (ctx), FALSE); + + return ctx->priv->always_trust; +} + + +/** + * g_mime_pkcs7_context_set_always_trust: + * @ctx: a #GMimePkcs7Context + * @always_trust: always trust flag + * + * Sets the @always_trust flag on the pkcs7 context which is used for + * encryption. + **/ +void +g_mime_pkcs7_context_set_always_trust (GMimePkcs7Context *ctx, gboolean always_trust) +{ + g_return_if_fail (GMIME_IS_PKCS7_CONTEXT (ctx)); + + ctx->priv->always_trust = always_trust; +} diff --git a/gmime/gmime-pkcs7-context.h b/gmime/gmime-pkcs7-context.h new file mode 100644 index 0000000..b9cff23 --- /dev/null +++ b/gmime/gmime-pkcs7-context.h @@ -0,0 +1,68 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_PKCS7_CONTEXT_H__ +#define __GMIME_PKCS7_CONTEXT_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_PKCS7_CONTEXT (g_mime_pkcs7_context_get_type ()) +#define GMIME_PKCS7_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_PKCS7_CONTEXT, GMimePkcs7Context)) +#define GMIME_PKCS7_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_PKCS7_CONTEXT, GMimePkcs7ContextClass)) +#define GMIME_IS_PKCS7_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_PKCS7_CONTEXT)) +#define GMIME_IS_PKCS7_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_PKCS7_CONTEXT)) +#define GMIME_PKCS7_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_PKCS7_CONTEXT, GMimePkcs7ContextClass)) + +typedef struct _GMimePkcs7Context GMimePkcs7Context; +typedef struct _GMimePkcs7ContextClass GMimePkcs7ContextClass; + + +/** + * GMimePkcs7Context: + * @parent_object: parent #GMimeCryptoContext + * @priv: private context data + * + * A PKCS7 crypto context. + **/ +struct _GMimePkcs7Context { + GMimeCryptoContext parent_object; + + struct _GMimePkcs7ContextPrivate *priv; +}; + +struct _GMimePkcs7ContextClass { + GMimeCryptoContextClass parent_class; + +}; + + +GType g_mime_pkcs7_context_get_type (void); + +GMimeCryptoContext *g_mime_pkcs7_context_new (GMimePasswordRequestFunc request_passwd); + +gboolean g_mime_pkcs7_context_get_always_trust (GMimePkcs7Context *ctx); +void g_mime_pkcs7_context_set_always_trust (GMimePkcs7Context *ctx, gboolean always_trust); + +G_END_DECLS + +#endif /* __GMIME_PKCS7_CONTEXT_H__ */ diff --git a/gmime/gmime-signature.c b/gmime/gmime-signature.c new file mode 100644 index 0000000..eb4fa43 --- /dev/null +++ b/gmime/gmime-signature.c @@ -0,0 +1,636 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-signature.h" + + +/** + * SECTION: gmime-signature + * @title: GMimeSignature + * @short_description: Digital signatures + * @see_also: + * + * A #GMimeSignature is an object containing useful information about a + * digital signature as used in signing and encrypting data. + **/ + + +static void g_mime_signature_class_init (GMimeSignatureClass *klass); +static void g_mime_signature_init (GMimeSignature *sig, GMimeSignatureClass *klass); +static void g_mime_signature_finalize (GObject *object); + +static GObjectClass *parent_class = NULL; + + +GType +g_mime_signature_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeSignatureClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_signature_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeSignature), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_signature_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeSignature", &info, 0); + } + + return type; +} + +static void +g_mime_signature_class_init (GMimeSignatureClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_signature_finalize; +} + +static void +g_mime_signature_init (GMimeSignature *sig, GMimeSignatureClass *klass) +{ + sig->status = GMIME_SIGNATURE_STATUS_GOOD; + sig->errors = GMIME_SIGNATURE_ERROR_NONE; + sig->cert = g_mime_certificate_new (); + sig->created = (time_t) -1; + sig->expires = (time_t) -1; +} + +static void +g_mime_signature_finalize (GObject *object) +{ + GMimeSignature *sig = (GMimeSignature *) object; + + if (sig->cert) + g_object_unref (sig->cert); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +/** + * g_mime_signature_new: + * + * Creates a new #GMimeSignature object. + * + * Returns: a new #GMimeSignature object. + **/ +GMimeSignature * +g_mime_signature_new (void) +{ + return g_object_newv (GMIME_TYPE_SIGNATURE, 0, NULL); +} + + +/** + * g_mime_signature_set_status: + * @sig: a #GMimeSignature + * @status: a #GMimeSignatureStatus + * + * Set the status on the signature. + **/ +void +g_mime_signature_set_status (GMimeSignature *sig, GMimeSignatureStatus status) +{ + g_return_if_fail (GMIME_IS_SIGNATURE (sig)); + + sig->status = status; +} + + +/** + * g_mime_signature_get_status: + * @sig: a #GMimeSignature + * + * Get the signature status. + * + * Returns: the signature status. + **/ +GMimeSignatureStatus +g_mime_signature_get_status (GMimeSignature *sig) +{ + g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), GMIME_SIGNATURE_STATUS_BAD); + + return sig->status; +} + + +/** + * g_mime_signature_set_errors: + * @sig: a #GMimeSignature + * @errors: a #GMimeSignatureError + * + * Set the errors on the signature. + **/ +void +g_mime_signature_set_errors (GMimeSignature *sig, GMimeSignatureError errors) +{ + g_return_if_fail (GMIME_IS_SIGNATURE (sig)); + + sig->errors = errors; +} + + +/** + * g_mime_signature_get_errors: + * @sig: a #GMimeSignature + * + * Get the signature errors. If the #GMimeSignatureStatus returned from + * g_mime_signature_get_status() is not #GMIME_SIGNATURE_STATUS_GOOD, then the + * errors may provide a clue as to why. + * + * Returns: a bitfield of errors. + **/ +GMimeSignatureError +g_mime_signature_get_errors (GMimeSignature *sig) +{ + g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), GMIME_SIGNATURE_ERROR_NONE); + + return sig->errors; +} + + +/** + * g_mime_signature_set_certificate: + * @sig: a #GMimeSignature + * @cert: a #GMimeCertificate + * + * Set the signature's certificate. + **/ +void +g_mime_signature_set_certificate (GMimeSignature *sig, GMimeCertificate *cert) +{ + g_return_if_fail (GMIME_IS_SIGNATURE (sig)); + g_return_if_fail (GMIME_IS_CERTIFICATE (cert)); + + if (sig->cert == cert) + return; + + if (sig->cert != NULL) + g_object_unref (sig->cert); + + if (cert != NULL) + g_object_ref (cert); + + sig->cert = cert; +} + + +/** + * g_mime_signature_get_certificate: + * @sig: a #GMimeSignature + * + * Get the signature's certificate. + * + * Returns: the signature's certificate. + **/ +GMimeCertificate * +g_mime_signature_get_certificate (GMimeSignature *sig) +{ + g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), NULL); + + return sig->cert; +} + + +/** + * g_mime_signature_set_created: + * @sig: a #GMimeSignature + * @created: creation date + * + * Set the creation date of the signature. + **/ +void +g_mime_signature_set_created (GMimeSignature *sig, time_t created) +{ + g_return_if_fail (GMIME_IS_SIGNATURE (sig)); + + sig->created = created; +} + + +/** + * g_mime_signature_get_created: + * @sig: a #GMimeSignature + * + * Get the creation date of the signature. + * + * Returns: the creation date of the signature or %-1 if unknown. + **/ +time_t +g_mime_signature_get_created (GMimeSignature *sig) +{ + g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), (time_t) -1); + + return sig->created; +} + + +/** + * g_mime_signature_set_expires: + * @sig: a #GMimeSignature + * @expires: expiration date + * + * Set the expiration date of the signature. + **/ +void +g_mime_signature_set_expires (GMimeSignature *sig, time_t expires) +{ + g_return_if_fail (GMIME_IS_SIGNATURE (sig)); + + sig->expires = expires; +} + + +/** + * g_mime_signature_get_expires: + * @sig: a #GMimeSignature + * + * Get the expiration date of the signature. + * + * Returns: the expiration date of the signature or %-1 if unknown. + **/ +time_t +g_mime_signature_get_expires (GMimeSignature *sig) +{ + g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), (time_t) -1); + + return sig->expires; +} + + +static void g_mime_signature_list_class_init (GMimeSignatureListClass *klass); +static void g_mime_signature_list_init (GMimeSignatureList *list, GMimeSignatureListClass *klass); +static void g_mime_signature_list_finalize (GObject *object); + + +static GObjectClass *list_parent_class = NULL; + + +GType +g_mime_signature_list_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeSignatureListClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_signature_list_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeSignatureList), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_signature_list_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeSignatureList", &info, 0); + } + + return type; +} + + +static void +g_mime_signature_list_class_init (GMimeSignatureListClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + list_parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_signature_list_finalize; +} + +static void +g_mime_signature_list_init (GMimeSignatureList *list, GMimeSignatureListClass *klass) +{ + list->array = g_ptr_array_new (); +} + +static void +g_mime_signature_list_finalize (GObject *object) +{ + GMimeSignatureList *list = (GMimeSignatureList *) object; + GMimeSignature *sig; + guint i; + + for (i = 0; i < list->array->len; i++) { + sig = (GMimeSignature *) list->array->pdata[i]; + g_object_unref (sig); + } + + g_ptr_array_free (list->array, TRUE); + + G_OBJECT_CLASS (list_parent_class)->finalize (object); +} + + +/** + * g_mime_signature_list_new: + * + * Creates a new #GMimeSignatureList. + * + * Returns: a new #GMimeSignatureList. + **/ +GMimeSignatureList * +g_mime_signature_list_new (void) +{ + return g_object_newv (GMIME_TYPE_SIGNATURE_LIST, 0, NULL); +} + + +/** + * g_mime_signature_list_length: + * @list: a #GMimeSignatureList + * + * Gets the length of the list. + * + * Returns: the number of #GMimeSignature objects in the list. + **/ +int +g_mime_signature_list_length (GMimeSignatureList *list) +{ + g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), -1); + + return list->array->len; +} + + +/** + * g_mime_signature_list_clear: + * @list: a #GMimeSignatureList + * + * Clears the list of addresses. + **/ +void +g_mime_signature_list_clear (GMimeSignatureList *list) +{ + GMimeSignature *sig; + guint i; + + g_return_if_fail (GMIME_IS_SIGNATURE_LIST (list)); + + for (i = 0; i < list->array->len; i++) { + sig = (GMimeSignature *) list->array->pdata[i]; + g_object_unref (sig); + } + + g_ptr_array_set_size (list->array, 0); +} + + +/** + * g_mime_signature_list_add: + * @list: a #GMimeSignatureList + * @sig: a #GMimeSignature + * + * Adds a #GMimeSignature to the #GMimeSignatureList. + * + * Returns: the index of the added #GMimeSignature. + **/ +int +g_mime_signature_list_add (GMimeSignatureList *list, GMimeSignature *sig) +{ + int index; + + g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), -1); + g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), -1); + + index = list->array->len; + g_ptr_array_add (list->array, sig); + g_object_ref (sig); + + return index; +} + + +/** + * g_mime_signature_list_insert: + * @list: a #GMimeSignatureList + * @index: index to insert at + * @sig: a #GMimeSignature + * + * Inserts a #GMimeSignature into the #GMimeSignatureList at the specified + * index. + **/ +void +g_mime_signature_list_insert (GMimeSignatureList *list, int index, GMimeSignature *sig) +{ + char *dest, *src; + size_t n; + + g_return_if_fail (GMIME_IS_SIGNATURE_LIST (list)); + g_return_if_fail (GMIME_IS_SIGNATURE (sig)); + g_return_if_fail (index >= 0); + + if ((guint) index < list->array->len) { + g_ptr_array_set_size (list->array, list->array->len + 1); + + dest = ((char *) list->array->pdata) + (sizeof (void *) * (index + 1)); + src = ((char *) list->array->pdata) + (sizeof (void *) * index); + n = list->array->len - index - 1; + + g_memmove (dest, src, (sizeof (void *) * n)); + list->array->pdata[index] = sig; + } else { + /* the easy case */ + g_ptr_array_add (list->array, sig); + } + + g_object_ref (sig); +} + + +/** + * g_mime_signature_list_remove: + * @list: a #GMimeSignatureList + * @sig: a #GMimeSignature + * + * Removes a #GMimeSignature from the #GMimeSignatureList. + * + * Returns: %TRUE if the specified #GMimeSignature was removed or %FALSE + * otherwise. + **/ +gboolean +g_mime_signature_list_remove (GMimeSignatureList *list, GMimeSignature *sig) +{ + int index; + + g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), FALSE); + g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), FALSE); + + if ((index = g_mime_signature_list_index_of (list, sig)) == -1) + return FALSE; + + g_mime_signature_list_remove_at (list, index); + + return TRUE; +} + + +/** + * g_mime_signature_list_remove_at: + * @list: a #GMimeSignatureList + * @index: index to remove + * + * Removes a #GMimeSignature from the #GMimeSignatureList at the specified + * index. + * + * Returns: %TRUE if an #GMimeSignature was removed or %FALSE otherwise. + **/ +gboolean +g_mime_signature_list_remove_at (GMimeSignatureList *list, int index) +{ + GMimeSignature *sig; + + g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), FALSE); + g_return_val_if_fail (index >= 0, FALSE); + + if ((guint) index >= list->array->len) + return FALSE; + + sig = list->array->pdata[index]; + g_ptr_array_remove_index (list->array, index); + g_object_unref (sig); + + return TRUE; +} + + +/** + * g_mime_signature_list_contains: + * @list: a #GMimeSignatureList + * @sig: a #GMimeSignature + * + * Checks whether or not the specified #GMimeSignature is contained within + * the #GMimeSignatureList. + * + * Returns: %TRUE if the specified #GMimeSignature is contained within the + * specified #GMimeSignatureList or %FALSE otherwise. + **/ +gboolean +g_mime_signature_list_contains (GMimeSignatureList *list, GMimeSignature *sig) +{ + return g_mime_signature_list_index_of (list, sig) != -1; +} + + +/** + * g_mime_signature_list_index_of: + * @list: a #GMimeSignatureList + * @sig: a #GMimeSignature + * + * Gets the index of the specified #GMimeSignature inside the + * #GMimeSignatureList. + * + * Returns: the index of the requested #GMimeSignature within the + * #GMimeSignatureList or %-1 if it is not contained within the + * #GMimeSignatureList. + **/ +int +g_mime_signature_list_index_of (GMimeSignatureList *list, GMimeSignature *sig) +{ + guint i; + + g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), -1); + g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), -1); + + for (i = 0; i < list->array->len; i++) { + if (list->array->pdata[i] == sig) + return i; + } + + return -1; +} + + +/** + * g_mime_signature_list_get_signature: + * @list: a #GMimeSignatureList + * @index: index of #GMimeSignature to get + * + * Gets the #GMimeSignature at the specified index. + * + * Returns: the #GMimeSignature at the specified index or %NULL if + * the index is out of range. + **/ +GMimeSignature * +g_mime_signature_list_get_signature (GMimeSignatureList *list, int index) +{ + g_return_val_if_fail (GMIME_IS_SIGNATURE_LIST (list), NULL); + g_return_val_if_fail (index >= 0, NULL); + + if ((guint) index >= list->array->len) + return NULL; + + return list->array->pdata[index]; +} + + +/** + * g_mime_signature_list_set_signature: + * @list: a #GMimeSignatureList + * @index: index of #GMimeSignature to set + * @sig: a #GMimeSignature + * + * Sets the #GMimeSignature at the specified index to @sig. + **/ +void +g_mime_signature_list_set_signature (GMimeSignatureList *list, int index, GMimeSignature *sig) +{ + GMimeSignature *old; + + g_return_if_fail (GMIME_IS_SIGNATURE_LIST (list)); + g_return_if_fail (GMIME_IS_SIGNATURE (sig)); + g_return_if_fail (index >= 0); + + if ((guint) index > list->array->len) + return; + + if ((guint) index == list->array->len) { + g_mime_signature_list_add (list, sig); + return; + } + + if ((old = list->array->pdata[index]) == sig) + return; + + list->array->pdata[index] = sig; + g_object_unref (old); + g_object_ref (sig); +} diff --git a/gmime/gmime-signature.h b/gmime/gmime-signature.h new file mode 100644 index 0000000..80ec8e4 --- /dev/null +++ b/gmime/gmime-signature.h @@ -0,0 +1,174 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_SIGNATURE_H__ +#define __GMIME_SIGNATURE_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_SIGNATURE (g_mime_signature_get_type ()) +#define GMIME_SIGNATURE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_SIGNATURE, GMimeSignature)) +#define GMIME_SIGNATURE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_SIGNATURE, GMimeSignatureClass)) +#define GMIME_IS_SIGNATURE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_SIGNATURE)) +#define GMIME_IS_SIGNATURE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_SIGNATURE)) +#define GMIME_SIGNATURE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_SIGNATURE, GMimeSignatureClass)) + +#define GMIME_TYPE_SIGNATURE_LIST (g_mime_signature_list_get_type ()) +#define GMIME_SIGNATURE_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_SIGNATURE_LIST, GMimeSignatureList)) +#define GMIME_SIGNATURE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_SIGNATURE_LIST, GMimeSignatureListClass)) +#define GMIME_IS_SIGNATURE_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_SIGNATURE_LIST)) +#define GMIME_IS_SIGNATURE_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_SIGNATURE_LIST)) +#define GMIME_SIGNATURE_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_SIGNATURE_LIST, GMimeSignatureListClass)) + + +typedef struct _GMimeSignature GMimeSignature; +typedef struct _GMimeSignatureClass GMimeSignatureClass; + +typedef struct _GMimeSignatureList GMimeSignatureList; +typedef struct _GMimeSignatureListClass GMimeSignatureListClass; + + +/** + * GMimeSignatureStatus: + * @GMIME_SIGNATURE_STATUS_GOOD: Good signature. + * @GMIME_SIGNATURE_STATUS_ERROR: An error occurred. + * @GMIME_SIGNATURE_STATUS_BAD: Bad signature. + * + * A value representing the signature status for a particular + * #GMimeSignature. + **/ +typedef enum { + GMIME_SIGNATURE_STATUS_GOOD, + GMIME_SIGNATURE_STATUS_ERROR, + GMIME_SIGNATURE_STATUS_BAD +} GMimeSignatureStatus; + + +/** + * GMimeSignatureError: + * @GMIME_SIGNATURE_ERROR_NONE: No error. + * @GMIME_SIGNATURE_ERROR_EXPSIG: Expired signature. + * @GMIME_SIGNATURE_ERROR_NO_PUBKEY: No public key found. + * @GMIME_SIGNATURE_ERROR_EXPKEYSIG: Expired signature key. + * @GMIME_SIGNATURE_ERROR_REVKEYSIG: Revoked signature key. + * @GMIME_SIGNATURE_ERROR_UNSUPP_ALGO: Unsupported algorithm. + * + * Possible errors that a #GMimeSignature could have. + **/ +typedef enum { + GMIME_SIGNATURE_ERROR_NONE = 0, + GMIME_SIGNATURE_ERROR_EXPSIG = (1 << 0), /* expired signature */ + GMIME_SIGNATURE_ERROR_NO_PUBKEY = (1 << 1), /* no public key */ + GMIME_SIGNATURE_ERROR_EXPKEYSIG = (1 << 2), /* expired key */ + GMIME_SIGNATURE_ERROR_REVKEYSIG = (1 << 3), /* revoked key */ + GMIME_SIGNATURE_ERROR_UNSUPP_ALGO = (1 << 4) /* unsupported algorithm */ +} GMimeSignatureError; + + +/** + * GMimeSignature: + * @parent_object: parent #GObject + * @status: A #GMimeSignatureStatus. + * @errors: A bitfield of #GMimeSignatureError values. + * @cert: The #GMimeCertificate used in the signature. + * @created: The creation date of the signature. + * @expires: The expiration date of the signature. + * + * An object containing useful information about a signature. + **/ +struct _GMimeSignature { + GObject parent_object; + + GMimeSignatureStatus status; + GMimeSignatureError errors; + GMimeCertificate *cert; + time_t created; + time_t expires; +}; + +struct _GMimeSignatureClass { + GObjectClass parent_class; + +}; + + +GType g_mime_signature_get_type (void); + +GMimeSignature *g_mime_signature_new (void); + +void g_mime_signature_set_certificate (GMimeSignature *sig, GMimeCertificate *cert); +GMimeCertificate *g_mime_signature_get_certificate (GMimeSignature *sig); + +void g_mime_signature_set_status (GMimeSignature *sig, GMimeSignatureStatus status); +GMimeSignatureStatus g_mime_signature_get_status (GMimeSignature *sig); + +void g_mime_signature_set_errors (GMimeSignature *sig, GMimeSignatureError errors); +GMimeSignatureError g_mime_signature_get_errors (GMimeSignature *sig); + +void g_mime_signature_set_created (GMimeSignature *sig, time_t created); +time_t g_mime_signature_get_created (GMimeSignature *sig); + +void g_mime_signature_set_expires (GMimeSignature *sig, time_t expires); +time_t g_mime_signature_get_expires (GMimeSignature *sig); + + +/** + * GMimeSignatureList: + * @parent_object: parent #GObject + * @array: An array of #GMimeSignature objects. + * + * A collection of #GMimeSignature objects. + **/ +struct _GMimeSignatureList { + GObject parent_object; + GPtrArray *array; +}; + +struct _GMimeSignatureListClass { + GObjectClass parent_class; + +}; + + +GType g_mime_signature_list_get_type (void); + +GMimeSignatureList *g_mime_signature_list_new (void); + +int g_mime_signature_list_length (GMimeSignatureList *list); + +void g_mime_signature_list_clear (GMimeSignatureList *list); + +int g_mime_signature_list_add (GMimeSignatureList *list, GMimeSignature *sig); +void g_mime_signature_list_insert (GMimeSignatureList *list, int index, GMimeSignature *sig); +gboolean g_mime_signature_list_remove (GMimeSignatureList *list, GMimeSignature *sig); +gboolean g_mime_signature_list_remove_at (GMimeSignatureList *list, int index); + +gboolean g_mime_signature_list_contains (GMimeSignatureList *list, GMimeSignature *sig); +int g_mime_signature_list_index_of (GMimeSignatureList *list, GMimeSignature *sig); + +GMimeSignature *g_mime_signature_list_get_signature (GMimeSignatureList *list, int index); +void g_mime_signature_list_set_signature (GMimeSignatureList *list, int index, GMimeSignature *sig); + +G_END_DECLS + +#endif /* __GMIME_SIGNATURE_H__ */ diff --git a/gmime/gmime-stream-buffer.c b/gmime/gmime-stream-buffer.c new file mode 100644 index 0000000..0cdc97e --- /dev/null +++ b/gmime/gmime-stream-buffer.c @@ -0,0 +1,843 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gmime-stream-buffer.h" + +/** + * SECTION: gmime-stream-buffer + * @title: GMimeStreamBuffer + * @short_description: A buffered stream + * @see_also: #GMimeStream + * + * A #GMimeStreamBuffer can be used on top of any other type of stream + * and has 3 modes: block reads, block writes, and cached reads. Block + * reads are especially useful if you will be making a lot of small + * reads from a stream that accesses the file system. Block writes are + * useful for very much the same reason. The final mode, cached reads, + * can become memory intensive but can be very helpful when inheriting + * from a stream that does not support seeking (Note: this mode is the + * least tested so be careful using it). + **/ + +#define BLOCK_BUFFER_LEN 4096 +#define BUFFER_GROW_SIZE 1024 /* should this also be 4k? */ + +static void g_mime_stream_buffer_class_init (GMimeStreamBufferClass *klass); +static void g_mime_stream_buffer_init (GMimeStreamBuffer *stream, GMimeStreamBufferClass *klass); +static void g_mime_stream_buffer_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GMimeStreamClass *parent_class = NULL; + + +GType +g_mime_stream_buffer_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamBufferClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_buffer_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStreamBuffer), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_buffer_init, + }; + + type = g_type_register_static (GMIME_TYPE_STREAM, "GMimeStreamBuffer", &info, 0); + } + + return type; +} + + +static void +g_mime_stream_buffer_class_init (GMimeStreamBufferClass *klass) +{ + GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_STREAM); + + object_class->finalize = g_mime_stream_buffer_finalize; + + stream_class->read = stream_read; + stream_class->write = stream_write; + stream_class->flush = stream_flush; + stream_class->close = stream_close; + stream_class->eos = stream_eos; + stream_class->reset = stream_reset; + stream_class->seek = stream_seek; + stream_class->tell = stream_tell; + stream_class->length = stream_length; + stream_class->substream = stream_substream; +} + +static void +g_mime_stream_buffer_init (GMimeStreamBuffer *stream, GMimeStreamBufferClass *klass) +{ + stream->source = NULL; + stream->buffer = NULL; + stream->bufptr = NULL; + stream->bufend = NULL; + stream->buflen = 0; + stream->mode = 0; +} + +static void +g_mime_stream_buffer_finalize (GObject *object) +{ + GMimeStreamBuffer *stream = (GMimeStreamBuffer *) object; + + if (stream->source) + g_object_unref (stream->source); + + g_free (stream->buffer); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t len) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + size_t buflen, offset; + ssize_t n, nread = 0; + + if (buffer->source == NULL) { + errno = EBADF; + return -1; + } + + switch (buffer->mode) { + case GMIME_STREAM_BUFFER_BLOCK_READ: + while (len > 0) { + /* consume what we can from any pre-buffered data we have left */ + if ((n = MIN (buffer->buflen, len)) > 0) { + memcpy (buf + nread, buffer->bufptr, n); + buffer->bufptr += n; + buffer->buflen -= n; + nread += n; + len -= n; + } + + if (len >= BLOCK_BUFFER_LEN) { + /* bypass intermediate buffer, read straight from disk */ + buffer->bufptr = buffer->buffer; + if ((n = g_mime_stream_read (buffer->source, buf + nread, len)) > 0) { + nread += n; + len -= n; + } + + break; + } else if (len > 0) { + /* buffer more data */ + if ((n = g_mime_stream_read (buffer->source, buffer->buffer, BLOCK_BUFFER_LEN)) > 0) + buffer->buflen = n; + + buffer->bufptr = buffer->buffer; + } + + if (n <= 0) { + if (nread == 0) + return n; + + break; + } + } + break; + case GMIME_STREAM_BUFFER_CACHE_READ: + while (len > 0) { + buflen = (size_t) (buffer->bufend - buffer->bufptr); + if ((n = MIN (buflen, len)) > 0) { + memcpy (buf + nread, buffer->bufptr, n); + buffer->bufptr += n; + nread += n; + len -= n; + } + + if (len > 0) { + /* we need to read more data... */ + offset = buffer->bufptr - buffer->buffer; + + buffer->buflen = buffer->bufend - buffer->buffer + MAX (BUFFER_GROW_SIZE, len); + buffer->buffer = g_realloc (buffer->buffer, buffer->buflen); + buffer->bufend = buffer->buffer + buffer->buflen; + buffer->bufptr = buffer->buffer + offset; + + n = g_mime_stream_read (buffer->source, buffer->bufptr, + buffer->bufend - buffer->bufptr); + + buffer->bufend = n > 0 ? buffer->bufptr + n : buffer->bufptr; + + if (n <= 0) { + if (nread == 0) + return n; + + break; + } + } + } + break; + default: + if ((nread = g_mime_stream_read (buffer->source, buf, len)) == -1) + return -1; + + break; + } + + stream->position += nread; + + return nread; +} + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + GMimeStream *source = buffer->source; + ssize_t n, nwritten = 0; + size_t left = len; + + if (buffer->source == NULL) { + errno = EBADF; + return -1; + } + + switch (buffer->mode) { + case GMIME_STREAM_BUFFER_BLOCK_WRITE: + while (left > 0) { + n = MIN (BLOCK_BUFFER_LEN - buffer->buflen, left); + if (buffer->buflen > 0 || n < BLOCK_BUFFER_LEN) { + /* add the data to our pending write buffer */ + memcpy (buffer->bufptr, buf + nwritten, n); + buffer->bufptr += n; + buffer->buflen += n; + nwritten += n; + left -= n; + } + + if (buffer->buflen == BLOCK_BUFFER_LEN) { + /* flush our buffer... */ + n = g_mime_stream_write (source, buffer->buffer, BLOCK_BUFFER_LEN); + if (n == BLOCK_BUFFER_LEN) { + /* wrote everything... */ + buffer->bufptr = buffer->buffer; + buffer->buflen = 0; + } else if (n > 0) { + /* still have buffered data left... */ + memmove (buffer->buffer, buffer->buffer + n, BLOCK_BUFFER_LEN - n); + buffer->bufptr -= n; + buffer->buflen -= n; + } else if (n == -1) { + if (nwritten == 0) + return -1; + + break; + } + } + + if (buffer->buflen == 0 && left >= BLOCK_BUFFER_LEN) { + while (left >= BLOCK_BUFFER_LEN) { + if ((n = g_mime_stream_write (source, buf + nwritten, BLOCK_BUFFER_LEN)) == -1) { + if (nwritten == 0) + return -1; + + break; + } + + nwritten += n; + left -= n; + } + + if (left >= BLOCK_BUFFER_LEN) + break; + } + } + break; + default: + if ((nwritten = g_mime_stream_write (source, buf, len)) == -1) + return -1; + + break; + } + + stream->position += nwritten; + + return nwritten; +} + +static int +stream_flush (GMimeStream *stream) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + + if (buffer->mode == GMIME_STREAM_BUFFER_BLOCK_WRITE && buffer->buflen > 0) { + ssize_t written = 0; + + written = g_mime_stream_write (buffer->source, buffer->buffer, buffer->buflen); + if (written > 0) { + memmove (buffer->buffer, buffer->buffer + written, buffer->buflen - written); + buffer->bufptr -= written; + buffer->buflen -= written; + } + + if (buffer->buflen != 0) + return -1; + } + + return g_mime_stream_flush (buffer->source); +} + +static int +stream_close (GMimeStream *stream) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + + if (buffer->source == NULL) + return 0; + + g_mime_stream_close (buffer->source); + g_object_unref (buffer->source); + buffer->source = NULL; + + g_free (buffer->buffer); + buffer->buffer = NULL; + buffer->bufptr = NULL; + buffer->bufend = NULL; + buffer->buflen = 0; + + return 0; +} + +static gboolean +stream_eos (GMimeStream *stream) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + + if (buffer->source == NULL) + return TRUE; + + if (!g_mime_stream_eos (buffer->source)) + return FALSE; + + switch (buffer->mode) { + case GMIME_STREAM_BUFFER_BLOCK_READ: + return buffer->buflen == 0; + case GMIME_STREAM_BUFFER_CACHE_READ: + return buffer->bufptr == buffer->bufend; + default: + break; + } + + return TRUE; +} + +static int +stream_reset (GMimeStream *stream) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + + if (buffer->source == NULL) { + errno = EBADF; + return -1; + } + + switch (buffer->mode) { + case GMIME_STREAM_BUFFER_BLOCK_READ: + case GMIME_STREAM_BUFFER_BLOCK_WRITE: + if (g_mime_stream_reset (buffer->source) == -1) + return -1; + + buffer->bufptr = buffer->buffer; + buffer->buflen = 0; + break; + case GMIME_STREAM_BUFFER_CACHE_READ: + buffer->bufptr = buffer->buffer; + break; + default: + if (g_mime_stream_reset (buffer->source) == -1) + return -1; + + break; + } + + return 0; +} + +static gint64 +stream_seek_block_read (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + gint64 real; + + /* convert all seeks into a relative seek (aka SEEK_CUR) */ + switch (whence) { + case GMIME_STREAM_SEEK_CUR: + /* no-op for now */ + break; + case GMIME_STREAM_SEEK_SET: + if (stream->position == offset) + return stream->position; + + if (offset < 0) { + /* not allowed to seek to a negative position */ + errno = EINVAL; + return -1; + } + + offset -= stream->position; + break; + case GMIME_STREAM_SEEK_END: + if (stream->bound_end == -1) { + /* gotta do this the slow way */ + if ((real = g_mime_stream_seek (buffer->source, offset, GMIME_STREAM_SEEK_END) == -1)) + return -1; + + stream->position = real; + + buffer->bufptr = buffer->buffer; + buffer->buflen = 0; + + return real; + } + + if (offset > 0) { + /* not allowed to seek past bound_end */ + errno = EINVAL; + return -1; + } + + offset += stream->bound_end; + break; + default: + /* invalid whence argument */ + errno = EINVAL; + return -1; + } + + /* now that offset is relative to our current position... */ + + if (offset == 0) + return stream->position; + + if ((offset < 0 && offset >= (buffer->buffer - buffer->bufptr)) + || (offset > 0 && offset <= buffer->buflen)) { + /* the position is within our pre-buffered region */ + stream->position += offset; + buffer->bufptr += (size_t) offset; + buffer->buflen -= (size_t) offset; + + return stream->position; + } + + /* we are now forced to do an actual seek */ + offset += stream->position; + if ((real = g_mime_stream_seek (buffer->source, offset, GMIME_STREAM_SEEK_SET)) == -1) + return -1; + + stream->position = real; + + buffer->bufptr = buffer->buffer; + buffer->buflen = 0; + + return real; +} + +static gint64 +stream_seek_cache_read (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + gint64 buflen, len, total = 0; + gint64 pos, real; + ssize_t nread; + + switch (whence) { + case GMIME_STREAM_SEEK_SET: + real = offset; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; + break; + case GMIME_STREAM_SEEK_END: + if (stream->bound_end == -1) { + /* we have to do a real seek because the end boundary is unknown */ + if ((real = g_mime_stream_seek (buffer->source, offset, whence)) == -1) + return -1; + + if (real < stream->bound_start) { + /* seek offset out of bounds */ + errno = EINVAL; + return -1; + } + } else { + real = stream->bound_end + offset; + if (real > stream->bound_end || real < stream->bound_start) { + /* seek offset out of bounds */ + errno = EINVAL; + return -1; + } + } + break; + default: + /* invalid whence argument */ + errno = EINVAL; + return -1; + } + + if (real > stream->position) { + /* buffer any data between position and real */ + len = real - (stream->bound_start + (buffer->bufend - buffer->bufptr)); + + if (buffer->bufptr + len <= buffer->bufend) { + buffer->bufptr += len; + stream->position = real; + return real; + } + + pos = buffer->bufptr - buffer->buffer; + + buflen = (buffer->bufend - buffer->buffer) + len; + if (buflen < G_MAXSIZE) + buffer->buflen = (size_t) buflen; + else + buffer->buflen = G_MAXSIZE; + + buffer->buffer = g_realloc (buffer->buffer, buffer->buflen); + buffer->bufend = buffer->buffer + buffer->buflen; + buffer->bufptr = buffer->buffer + pos; + + do { + nread = g_mime_stream_read (buffer->source, buffer->bufptr, + buffer->bufend - buffer->bufptr); + if (nread > 0) { + total += nread; + buffer->bufptr += nread; + } + } while (nread != -1); + + buffer->bufend = buffer->bufptr; + if (total < len) { + /* we failed to seek that far so reset our bufptr */ + buffer->bufptr = buffer->buffer + pos; + errno = EINVAL; + return -1; + } + } else if (real < stream->bound_start) { + /* seek offset out of bounds */ + errno = EINVAL; + return -1; + } else { + /* seek our cache pointer backwards */ + buffer->bufptr = buffer->buffer + (real - stream->bound_start); + } + + stream->position = real; + + return real; +} + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + gint64 real; + + if (buffer->source == NULL) { + errno = EBADF; + return -1; + } + + switch (buffer->mode) { + case GMIME_STREAM_BUFFER_BLOCK_WRITE: + if (stream_flush (stream) != 0) + return -1; + + if ((real = g_mime_stream_seek (buffer->source, offset, whence)) != -1) { + stream->position = real; + buffer->buflen = 0; + } + + return real; + case GMIME_STREAM_BUFFER_BLOCK_READ: + return stream_seek_block_read (stream, offset, whence); + case GMIME_STREAM_BUFFER_CACHE_READ: + return stream_seek_cache_read (stream, offset, whence); + default: + /* invalid whence argument */ + errno = EINVAL; + return -1; + } +} + +static gint64 +stream_tell (GMimeStream *stream) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + + if (buffer->source == NULL) { + errno = EBADF; + return -1; + } + + return stream->position; +} + +static gint64 +stream_length (GMimeStream *stream) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + + if (buffer->source == NULL) { + errno = EBADF; + return -1; + } + + return g_mime_stream_length (buffer->source); +} + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream; + + /* FIXME: for cached reads we want to substream ourself rather + than substreaming our source because we have to assume that + the reason this stream is setup to do cached reads is + because the source stream is unseekable. */ + + return GMIME_STREAM_GET_CLASS (buffer->source)->substream (buffer->source, start, end); +} + + +/** + * g_mime_stream_buffer_new: + * @source: source stream + * @mode: buffering mode + * + * Creates a new GMimeStreamBuffer object. + * + * Returns: a new buffer stream with source @source and mode @mode. + **/ +GMimeStream * +g_mime_stream_buffer_new (GMimeStream *source, GMimeStreamBufferMode mode) +{ + GMimeStreamBuffer *buffer; + + g_return_val_if_fail (GMIME_IS_STREAM (source), NULL); + + buffer = g_object_newv (GMIME_TYPE_STREAM_BUFFER, 0, NULL); + + buffer->source = source; + g_object_ref (source); + + buffer->mode = mode; + + switch (buffer->mode) { + case GMIME_STREAM_BUFFER_BLOCK_READ: + case GMIME_STREAM_BUFFER_BLOCK_WRITE: + buffer->buffer = g_malloc (BLOCK_BUFFER_LEN); + buffer->bufend = buffer->buffer + BLOCK_BUFFER_LEN; + buffer->bufptr = buffer->buffer; + buffer->buflen = 0; + break; + default: + buffer->buffer = g_malloc (BUFFER_GROW_SIZE); + buffer->bufptr = buffer->buffer; + buffer->bufend = buffer->buffer; + buffer->buflen = BUFFER_GROW_SIZE; + break; + } + + g_mime_stream_construct (GMIME_STREAM (buffer), + source->bound_start, + source->bound_end); + + return GMIME_STREAM (buffer); +} + + +/** + * g_mime_stream_buffer_gets: + * @stream: stream + * @buf: line buffer + * @max: max length of a line + * + * Reads in at most one less than @max characters from @stream and + * stores them into the buffer pointed to by @buf. Reading stops after + * an EOS or newline ('\n'). If a newline is read, it is stored into + * the buffer. A '\0' is stored after the last character in the + * buffer. + * + * Returns: the number of characters read into @buf on success or %-1 + * on fail. + **/ +ssize_t +g_mime_stream_buffer_gets (GMimeStream *stream, char *buf, size_t max) +{ + register char *inptr, *outptr; + char *inend, *outend; + ssize_t nread, n; + char c = '\0'; + + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + + outptr = buf; + outend = buf + max - 1; + + if (GMIME_IS_STREAM_BUFFER (stream)) { + GMimeStreamBuffer *buffer = GMIME_STREAM_BUFFER (stream); + + switch (buffer->mode) { + case GMIME_STREAM_BUFFER_BLOCK_READ: + while (outptr < outend) { + inptr = buffer->bufptr; + inend = inptr + buffer->buflen; + + while (outptr < outend && inptr < inend && *inptr != '\n') + c = *outptr++ = *inptr++; + + if (outptr < outend && inptr < inend && c != '\n') + c = *outptr++ = *inptr++; + + buffer->buflen = inend - inptr; + buffer->bufptr = inptr; + + if (c == '\n') + break; + + if (buffer->buflen == 0) { + /* buffer more data */ + buffer->bufptr = buffer->buffer; + n = g_mime_stream_read (buffer->source, buffer->buffer, BLOCK_BUFFER_LEN); + if (n <= 0) + break; + + buffer->buflen = n; + } + } + break; + case GMIME_STREAM_BUFFER_CACHE_READ: + while (outptr < outend) { + inptr = buffer->bufptr; + inend = buffer->bufend; + while (outptr < outend && inptr < inend && *inptr != '\n') + c = *outptr++ = *inptr++; + + if (outptr < outend && inptr < inend && c != '\n') + c = *outptr++ = *inptr++; + + buffer->bufptr = inptr; + + if (c == '\n') + break; + + if (inptr == inend && outptr < outend) { + /* buffer more data */ + size_t offset = (size_t) (buffer->bufptr - buffer->buffer); + + buffer->buflen = buffer->bufend - buffer->buffer + + MAX (BUFFER_GROW_SIZE, outend - outptr + 1); + buffer->buffer = g_realloc (buffer->buffer, buffer->buflen); + buffer->bufend = buffer->buffer + buffer->buflen; + buffer->bufptr = buffer->buffer + offset; + nread = g_mime_stream_read (buffer->source, buffer->bufptr, + buffer->bufend - buffer->bufptr); + + buffer->bufend = nread >= 0 ? buffer->bufptr + nread : buffer->bufptr; + + if (nread <= 0) + break; + } + } + break; + default: + goto slow_and_painful; + break; + } + + /* increment our stream position pointer */ + stream->position += (outptr - buf); + } else { + /* ugh...do it the slow and painful way... */ + slow_and_painful: + while (outptr < outend && c != '\n' && (nread = g_mime_stream_read (stream, &c, 1)) == 1) + *outptr++ = c; + } + + if (outptr <= outend) { + /* this should always be true unless @max == 0 */ + *outptr = '\0'; + } + + return (ssize_t) (outptr - buf); +} + + +/** + * g_mime_stream_buffer_readln: + * @stream: stream + * @buffer: output buffer + * + * Reads a single line into @buffer. + **/ +void +g_mime_stream_buffer_readln (GMimeStream *stream, GByteArray *buffer) +{ + char linebuf[1024]; + ssize_t len; + + g_return_if_fail (GMIME_IS_STREAM (stream)); + + while (!g_mime_stream_eos (stream)) { + if ((len = g_mime_stream_buffer_gets (stream, linebuf, sizeof (linebuf))) <= 0) + break; + + if (buffer) + g_byte_array_append (buffer, (unsigned char *) linebuf, len); + + if (linebuf[len - 1] == '\n') + break; + } +} diff --git a/gmime/gmime-stream-buffer.h b/gmime/gmime-stream-buffer.h new file mode 100644 index 0000000..280b145 --- /dev/null +++ b/gmime/gmime-stream-buffer.h @@ -0,0 +1,95 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_BUFFER_H__ +#define __GMIME_STREAM_BUFFER_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM_BUFFER (g_mime_stream_buffer_get_type ()) +#define GMIME_STREAM_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM_BUFFER, GMimeStreamBuffer)) +#define GMIME_STREAM_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM_BUFFER, GMimeStreamBufferClass)) +#define GMIME_IS_STREAM_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM_BUFFER)) +#define GMIME_IS_STREAM_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM_BUFFER)) +#define GMIME_STREAM_BUFFER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM_BUFFER, GMimeStreamBufferClass)) + +typedef struct _GMimeStreamBuffer GMimeStreamBuffer; +typedef struct _GMimeStreamBufferClass GMimeStreamBufferClass; + + +/** + * GMimeStreamBufferMode: + * @GMIME_STREAM_BUFFER_CACHE_READ: Cache all reads. + * @GMIME_STREAM_BUFFER_BLOCK_READ: Read in 4k blocks. + * @GMIME_STREAM_BUFFER_BLOCK_WRITE: Write in 4k blocks. + * + * The buffering mode for a #GMimeStreamBuffer stream. + **/ +typedef enum { + GMIME_STREAM_BUFFER_CACHE_READ, + GMIME_STREAM_BUFFER_BLOCK_READ, + GMIME_STREAM_BUFFER_BLOCK_WRITE +} GMimeStreamBufferMode; + + +/** + * GMimeStreamBuffer: + * @parent_object: parent #GMimeStream + * @mode: buffering mode + * @source: source stream + * @buffer: internal buffer + * @bufptr: current position in the buffer + * @bufend: end of the buffer + * @buflen: buffer length + * + * A buffered stream wrapper around any #GMimeStream object. + **/ +struct _GMimeStreamBuffer { + GMimeStream parent_object; + + GMimeStreamBufferMode mode; + GMimeStream *source; + + char *buffer; + char *bufptr; + char *bufend; + size_t buflen; +}; + +struct _GMimeStreamBufferClass { + GMimeStreamClass parent_class; + +}; + + +GType g_mime_stream_buffer_get_type (void); + +GMimeStream *g_mime_stream_buffer_new (GMimeStream *source, GMimeStreamBufferMode mode); + +ssize_t g_mime_stream_buffer_gets (GMimeStream *stream, char *buf, size_t max); + +void g_mime_stream_buffer_readln (GMimeStream *stream, GByteArray *buffer); + +G_END_DECLS + +#endif /* __GMIME_STREAM_BUFFER_H__ */ diff --git a/gmime/gmime-stream-cat.c b/gmime/gmime-stream-cat.c new file mode 100644 index 0000000..1fca797 --- /dev/null +++ b/gmime/gmime-stream-cat.c @@ -0,0 +1,730 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-stream-cat.h" + +#define d(x) + + +/** + * SECTION: gmime-stream-cat + * @title: GMimeStreamCat + * @short_description: A concatenated stream + * @see_also: #GMimeStream + * + * A #GMimeStream which chains together any number of other streams. + **/ + + +static void g_mime_stream_cat_class_init (GMimeStreamCatClass *klass); +static void g_mime_stream_cat_init (GMimeStreamCat *stream, GMimeStreamCatClass *klass); +static void g_mime_stream_cat_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GMimeStreamClass *parent_class = NULL; + + +struct _cat_node { + struct _cat_node *next; + GMimeStream *stream; + gint64 position; + int id; /* for debugging */ +}; + +GType +g_mime_stream_cat_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamCatClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_cat_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStreamCat), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_cat_init, + }; + + type = g_type_register_static (GMIME_TYPE_STREAM, "GMimeStreamCat", &info, 0); + } + + return type; +} + + +static void +g_mime_stream_cat_class_init (GMimeStreamCatClass *klass) +{ + GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_STREAM); + + object_class->finalize = g_mime_stream_cat_finalize; + + stream_class->read = stream_read; + stream_class->write = stream_write; + stream_class->flush = stream_flush; + stream_class->close = stream_close; + stream_class->eos = stream_eos; + stream_class->reset = stream_reset; + stream_class->seek = stream_seek; + stream_class->tell = stream_tell; + stream_class->length = stream_length; + stream_class->substream = stream_substream; +} + +static void +g_mime_stream_cat_init (GMimeStreamCat *stream, GMimeStreamCatClass *klass) +{ + stream->sources = NULL; + stream->current = NULL; +} + +static void +g_mime_stream_cat_finalize (GObject *object) +{ + GMimeStreamCat *cat = (GMimeStreamCat *) object; + struct _cat_node *n, *nn; + + n = cat->sources; + while (n != NULL) { + nn = n->next; + g_object_unref (n->stream); + g_free (n); + n = nn; + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t len) +{ + GMimeStreamCat *cat = (GMimeStreamCat *) stream; + struct _cat_node *current; + ssize_t nread = 0; + gint64 offset; + + /* check for end-of-stream */ + if (stream->bound_end != -1 && stream->position >= stream->bound_end) + return -1; + + /* don't allow our caller to read past the end of the stream */ + if (stream->bound_end != -1) + len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); + + if (!(current = cat->current)) + return -1; + + /* make sure our stream position is where it should be */ + offset = current->stream->bound_start + current->position; + if (g_mime_stream_seek (current->stream, offset, GMIME_STREAM_SEEK_SET) == -1) + return -1; + + do { + if ((nread = g_mime_stream_read (current->stream, buf, len)) <= 0) { + cat->current = current = current->next; + if (current != NULL) { + if (g_mime_stream_reset (current->stream) == -1) + return -1; + current->position = 0; + } + nread = 0; + } else if (nread > 0) { + current->position += nread; + } + } while (nread == 0 && current != NULL); + + if (nread > 0) + stream->position += nread; + + return nread; +} + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + GMimeStreamCat *cat = (GMimeStreamCat *) stream; + struct _cat_node *current; + size_t nwritten = 0; + ssize_t n = -1; + gint64 offset; + + /* check for end-of-stream */ + if (stream->bound_end != -1 && stream->position >= stream->bound_end) + return -1; + + /* don't allow our caller to write past the end of the stream */ + if (stream->bound_end != -1) + len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); + + if (!(current = cat->current)) + return -1; + + /* make sure our stream position is where it should be */ + offset = current->stream->bound_start + current->position; + if (g_mime_stream_seek (current->stream, offset, GMIME_STREAM_SEEK_SET) == -1) + return -1; + + do { + n = -1; + while (!g_mime_stream_eos (current->stream) && nwritten < len) { + if ((n = g_mime_stream_write (current->stream, buf + nwritten, len - nwritten)) <= 0) + break; + + current->position += n; + + nwritten += n; + } + + if (nwritten < len) { + /* try spilling over into the next stream */ + current = current->next; + if (current) { + current->position = 0; + if (g_mime_stream_reset (current->stream) == -1) + break; + } else { + break; + } + } + } while (nwritten < len); + + stream->position += nwritten; + + cat->current = current; + + if (n == -1 && nwritten == 0) + return -1; + + return nwritten; +} + +static int +stream_flush (GMimeStream *stream) +{ + GMimeStreamCat *cat = (GMimeStreamCat *) stream; + struct _cat_node *node; + int errnosav = 0; + int rv = 0; + + /* flush all streams up to and including the current stream */ + + node = cat->sources; + while (node) { + if (g_mime_stream_flush (node->stream) == -1) { + if (errnosav == 0) + errnosav = errno; + rv = -1; + } + + if (node == cat->current) + break; + + node = node->next; + } + + return rv; +} + +static int +stream_close (GMimeStream *stream) +{ + GMimeStreamCat *cat = (GMimeStreamCat *) stream; + struct _cat_node *n, *nn; + + cat->current = NULL; + n = cat->sources; + while (n != NULL) { + nn = n->next; + g_object_unref (n->stream); + g_free (n); + n = nn; + } + + cat->sources = NULL; + + return 0; +} + +static gboolean +stream_eos (GMimeStream *stream) +{ + GMimeStreamCat *cat = (GMimeStreamCat *) stream; + + if (cat->current == NULL) + return TRUE; + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) + return TRUE; + + return FALSE; +} + +static int +stream_reset (GMimeStream *stream) +{ + GMimeStreamCat *cat = (GMimeStreamCat *) stream; + struct _cat_node *n; + + if (stream->position == stream->bound_start) + return 0; + + n = cat->sources; + while (n != NULL) { + if (g_mime_stream_reset (n->stream) == -1) + return -1; + + n->position = 0; + n = n->next; + } + + cat->current = cat->sources; + + return 0; +} + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamCat *cat = (GMimeStreamCat *) stream; + struct _cat_node *current, *n; + gint64 real, off, len; + + d(fprintf (stderr, "GMimeStreamCat::stream_seek (%p, %ld, %d)\n", + stream, offset, whence)); + + if (cat->sources == NULL) + return -1; + + switch (whence) { + case GMIME_STREAM_SEEK_SET: + seek_set: + /* sanity check our seek - make sure we don't under/over-seek our bounds */ + if (offset < 0) { + d(fprintf (stderr, "offset %ld < 0, fail\n", offset)); + return -1; + } + + /* sanity check our seek */ + if (stream->bound_end != -1 && offset > stream->bound_end) { + d(fprintf (stderr, "offset %ld > bound_end %ld, fail\n", + offset, stream->bound_end)); + return -1; + } + + /* short-cut if we are seeking to our current position */ + if (offset == stream->position) { + d(fprintf (stderr, "offset %ld == stream->position %ld, no need to seek\n", + offset, stream->position)); + return offset; + } + + real = 0; + n = cat->sources; + current = cat->current; + + while (n != current) { + if (real + n->position > offset) + break; + real += n->position; + n = n->next; + } + + if (n == NULL) { + /* offset not within our grasp... */ + return -1; + } + + if (n != current) { + /* seeking to a previous stream (n->stream) */ + if ((offset - real) != n->position) { + /* FIXME: could probably skip these seek checks... */ + off = n->stream->bound_start + (offset - real); + if (g_mime_stream_seek (n->stream, off, GMIME_STREAM_SEEK_SET) == -1) + return -1; + } + + d(fprintf (stderr, "setting current stream to %i and updating cur->position to %ld\n", + n->id, offset - real)); + + current = n; + current->position = offset - real; + + break; + } else { + /* seeking to someplace in our current (or next) stream */ + d(fprintf (stderr, "seek offset %ld in current stream[%d] or after\n", + offset, current->id)); + if ((offset - real) == current->position) { + /* exactly at our current position */ + d(fprintf (stderr, "seek offset at cur position of stream[%d]\n", + current->id)); + stream->position = offset; + return offset; + } + + if ((offset - real) < current->position) { + /* in current stream, but before current position */ + d(fprintf (stderr, "seeking backwards in cur stream[%d]\n", + current->id)); + /* FIXME: again, could probably skip seek checks... */ + off = current->stream->bound_start + (offset - real); + if (g_mime_stream_seek (current->stream, off, GMIME_STREAM_SEEK_SET) == -1) + return -1; + + d(fprintf (stderr, "setting cur stream[%d] position to %ld\n", + current->id, offset - real)); + current->position = offset - real; + + break; + } + + /* after our current position */ + d(fprintf (stderr, "after cur position in stream[%d] or in a later stream\n", + current->id)); + do { + if (current->stream->bound_end != -1) { + len = current->stream->bound_end - current->stream->bound_start; + } else { + if ((len = g_mime_stream_length (current->stream)) == -1) + return -1; + } + + d(fprintf (stderr, "real = %lld, stream[%d] len = %lld\n", + real, current->id, len)); + + if ((real + len) > offset) { + /* within the bounds of the current stream */ + d(fprintf (stderr, "offset within bounds of stream[%d]\n", + current->id)); + break; + } else { + d(fprintf (stderr, "not within bounds of stream[%d]\n", + current->id)); + current->position = len; + real += len; + + current = current->next; + if (current == NULL) { + d(fprintf (stderr, "ran out of streams, failed\n")); + return -1; + } + + d(fprintf (stderr, "advanced to stream[%d]...\n", current->id)); + + if (g_mime_stream_reset (current->stream) == -1) + return -1; + + current->position = 0; + } + } while (1); + + /* FIXME: another seek check... probably can skip this */ + off = current->stream->bound_start + (offset - real); + if (g_mime_stream_seek (current->stream, off, GMIME_STREAM_SEEK_SET) == -1) + return -1; + + d(fprintf (stderr, "setting cur position of stream[%d] to %ld\n", + current->id, offset - real)); + current->position = offset - real; + } + + break; + case GMIME_STREAM_SEEK_CUR: + if (offset == 0) + return stream->position; + + /* calculate offset relative to the beginning of the stream */ + offset = stream->position + offset; + goto seek_set; + break; + case GMIME_STREAM_SEEK_END: + if (offset > 0) + return -1; + + /* calculate the offset of the end of the stream */ + n = cat->sources; + real = stream->bound_start; + while (n != NULL) { + if ((len = g_mime_stream_length (n->stream)) == -1) + return -1; + + real += len; + n = n->next; + } + + /* calculate offset relative to the beginning of the stream */ + offset = real + offset; + goto seek_set; + break; + default: + g_assert_not_reached (); + return -1; + } + + d(fprintf (stderr, "setting stream->offset to %ld and current stream to %d\n", + offset, current->id)); + + stream->position = offset; + cat->current = current; + + /* reset all following streams */ + n = current->next; + while (n != NULL) { + if (g_mime_stream_reset (n->stream) == -1) + return -1; + n->position = 0; + n = n->next; + } + + return offset; +} + +static gint64 +stream_tell (GMimeStream *stream) +{ + return stream->position; +} + +static gint64 +stream_length (GMimeStream *stream) +{ + GMimeStreamCat *cat = GMIME_STREAM_CAT (stream); + gint64 len, total = 0; + struct _cat_node *n; + + if (stream->bound_end != -1) + return stream->bound_end - stream->bound_start; + + n = cat->sources; + while (n != NULL) { + if ((len = g_mime_stream_length (n->stream)) == -1) + return -1; + + total += len; + n = n->next; + } + + return total; +} + +struct _sub_node { + struct _sub_node *next; + GMimeStream *stream; + gint64 start, end; +}; + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + GMimeStreamCat *cat = (GMimeStreamCat *) stream; + struct _sub_node *streams, *tail, *s; + gint64 offset = 0, subend = 0; + GMimeStream *substream; + struct _cat_node *n; + gint64 len; + + d(fprintf (stderr, "GMimeStreamCat::substream (%p, %ld, %ld)\n", stream, start, end)); + + /* find the first source stream that contains data we're interested in... */ + n = cat->sources; + while (offset < start && n != NULL) { + if (n->stream->bound_end == -1) { + if ((len = g_mime_stream_length (n->stream)) == -1) + return NULL; + } else { + len = n->stream->bound_end - n->stream->bound_start; + } + + if ((offset + len) > start) + break; + + offset += len; + + n = n->next; + } + + if (n == NULL) + return NULL; + + d(fprintf (stderr, "stream[%d] is the first stream containing data we want\n", n->id)); + + streams = NULL; + tail = (struct _sub_node *) &streams; + + do { + s = g_new (struct _sub_node, 1); + s->next = NULL; + s->stream = n->stream; + tail->next = s; + tail = s; + + s->start = n->stream->bound_start; + if (n == cat->sources) + s->start += start; + else if (offset < start) + s->start += (start - offset); + + d(fprintf (stderr, "added stream[%d] to our list\n", n->id)); + + if (n->stream->bound_end == -1) { + if ((len = g_mime_stream_length (n->stream)) == -1) + goto error; + } else { + len = n->stream->bound_end - n->stream->bound_start; + } + + d(fprintf (stderr, "stream[%d]: len = %ld, offset of beginning of stream is %ld\n", + n->id, len, offset)); + + if (end != -1 && (end <= (offset + len))) { + d(fprintf (stderr, "stream[%d]: requested end <= offset + len\n", n->id)); + s->end = n->stream->bound_start + (end - offset); + d(fprintf (stderr, "stream[%d]: s->start = %ld, s->end = %ld; break\n", + n->id, s->start, s->end)); + subend += (end - offset); + break; + } else { + s->end = n->stream->bound_start + len; + d(fprintf (stderr, "stream[%d]: s->start = %ld, s->end = %ld\n", + n->id, s->start, s->end)); + } + + subend += (s->end - s->start); + offset += len; + + n = n->next; + } while (n != NULL); + + d(fprintf (stderr, "returning a substream containing multiple source streams\n")); + cat = g_object_newv (GMIME_TYPE_STREAM_CAT, 0, NULL); + /* Note: we could pass -1 as bound_end, it should Just + * Work(tm) but setting absolute bounds is kinda + * nice... */ + g_mime_stream_construct (GMIME_STREAM (cat), 0, subend); + + while (streams != NULL) { + s = streams->next; + substream = g_mime_stream_substream (streams->stream, streams->start, streams->end); + g_mime_stream_cat_add_source (cat, substream); + g_object_unref (substream); + g_free (streams); + streams = s; + } + + substream = (GMimeStream *) cat; + + return substream; + + error: + + while (streams != NULL) { + s = streams->next; + g_free (streams); + streams = s; + } + + return NULL; +} + + +/** + * g_mime_stream_cat_new: + * + * Creates a new #GMimeStreamCat object. + * + * Returns: a new #GMimeStreamCat stream. + **/ +GMimeStream * +g_mime_stream_cat_new (void) +{ + GMimeStream *stream; + + stream = g_object_newv (GMIME_TYPE_STREAM_CAT, 0, NULL); + g_mime_stream_construct (stream, 0, -1); + + return stream; +} + + +/** + * g_mime_stream_cat_add_source: + * @cat: a #GMimeStreamCat + * @source: a source stream + * + * Adds the @source stream to the @cat. + * + * Returns: %0 on success or %-1 on fail. + **/ +int +g_mime_stream_cat_add_source (GMimeStreamCat *cat, GMimeStream *source) +{ + struct _cat_node *node, *n; + + g_return_val_if_fail (GMIME_IS_STREAM_CAT (cat), -1); + g_return_val_if_fail (GMIME_IS_STREAM (source), -1); + + node = g_new (struct _cat_node, 1); + node->next = NULL; + node->stream = source; + g_object_ref (source); + node->position = 0; + + n = cat->sources; + while (n && n->next) + n = n->next; + + if (n == NULL) { + cat->sources = node; + node->id = 0; + } else { + node->id = n->id + 1; + n->next = node; + } + + if (!cat->current) + cat->current = node; + + return 0; +} diff --git a/gmime/gmime-stream-cat.h b/gmime/gmime-stream-cat.h new file mode 100644 index 0000000..a20397a --- /dev/null +++ b/gmime/gmime-stream-cat.h @@ -0,0 +1,69 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_CAT_H__ +#define __GMIME_STREAM_CAT_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM_CAT (g_mime_stream_cat_get_type ()) +#define GMIME_STREAM_CAT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM_CAT, GMimeStreamCat)) +#define GMIME_STREAM_CAT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM_CAT, GMimeStreamCatClass)) +#define GMIME_IS_STREAM_CAT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM_CAT)) +#define GMIME_IS_STREAM_CAT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM_CAT)) +#define GMIME_STREAM_CAT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM_CAT, GMimeStreamCatClass)) + +typedef struct _GMimeStreamCat GMimeStreamCat; +typedef struct _GMimeStreamCatClass GMimeStreamCatClass; + +/** + * GMimeStreamCat: + * @parent_object: parent #GMimeStream + * @sources: list of sources + * @current: current source + * + * A concatenation of other #GMimeStream objects. + **/ +struct _GMimeStreamCat { + GMimeStream parent_object; + + struct _cat_node *sources; + struct _cat_node *current; +}; + +struct _GMimeStreamCatClass { + GMimeStreamClass parent_class; + +}; + + +GType g_mime_stream_cat_get_type (void); + +GMimeStream *g_mime_stream_cat_new (void); + +int g_mime_stream_cat_add_source (GMimeStreamCat *cat, GMimeStream *source); + +G_END_DECLS + +#endif /* __GMIME_STREAM_CAT_H__ */ diff --git a/gmime/gmime-stream-file.c b/gmime/gmime-stream-file.c new file mode 100644 index 0000000..c27ed16 --- /dev/null +++ b/gmime/gmime-stream-file.c @@ -0,0 +1,455 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#ifdef G_OS_WIN32 +#include +#include +#endif +#include + +#include "gmime-stream-file.h" + + +/** + * SECTION: gmime-stream-file + * @title: GMimeStreamFile + * @short_description: A Standard-C FILE-based stream + * @see_also: #GMimeStream + * + * A simple #GMimeStream implementation that sits on top of the + * Standard C FILE pointer based I/O layer. Unlike #GMimeStreamFs, a + * #GMimeStreamFile will typically buffer read and write operations at + * the FILE level and so it may be wasteful to wrap one in a + * #GMimeStreamBuffer stream. + **/ + + +static void g_mime_stream_file_class_init (GMimeStreamFileClass *klass); +static void g_mime_stream_file_init (GMimeStreamFile *stream, GMimeStreamFileClass *klass); +static void g_mime_stream_file_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GMimeStreamClass *parent_class = NULL; + + +GType +g_mime_stream_file_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamFileClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_file_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStreamFile), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_file_init, + }; + + type = g_type_register_static (GMIME_TYPE_STREAM, "GMimeStreamFile", &info, 0); + } + + return type; +} + + +static void +g_mime_stream_file_class_init (GMimeStreamFileClass *klass) +{ + GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_STREAM); + + object_class->finalize = g_mime_stream_file_finalize; + + stream_class->read = stream_read; + stream_class->write = stream_write; + stream_class->flush = stream_flush; + stream_class->close = stream_close; + stream_class->eos = stream_eos; + stream_class->reset = stream_reset; + stream_class->seek = stream_seek; + stream_class->tell = stream_tell; + stream_class->length = stream_length; + stream_class->substream = stream_substream; +} + +static void +g_mime_stream_file_init (GMimeStreamFile *stream, GMimeStreamFileClass *klass) +{ + stream->owner = TRUE; + stream->fp = NULL; +} + +static void +g_mime_stream_file_finalize (GObject *object) +{ + GMimeStreamFile *stream = (GMimeStreamFile *) object; + + if (stream->owner && stream->fp) + fclose (stream->fp); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t len) +{ + GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + size_t nread; + + if (fstream->fp == NULL) { + errno = EBADF; + return -1; + } + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1) + len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); + + /* make sure we are at the right position */ + fseek (fstream->fp, (long) stream->position, SEEK_SET); + + if ((nread = fread (buf, 1, len, fstream->fp)) > 0) + stream->position += nread; + + return (ssize_t) nread; +} + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + size_t nwritten; + + if (fstream->fp == NULL) { + errno = EBADF; + return -1; + } + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1) + len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); + + /* make sure we are at the right position */ + fseek (fstream->fp, (long) stream->position, SEEK_SET); + + if ((nwritten = fwrite (buf, 1, len, fstream->fp)) > 0) + stream->position += nwritten; + + return (ssize_t) nwritten; +} + +static int +stream_flush (GMimeStream *stream) +{ + GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + + if (fstream->fp == NULL) { + errno = EBADF; + return -1; + } + + return fflush (fstream->fp); +} + +static int +stream_close (GMimeStream *stream) +{ + GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + int rv; + + if (fstream->fp == NULL) + return 0; + + if ((rv = fclose (fstream->fp)) != 0) + fstream->fp = NULL; + + return rv; +} + +static gboolean +stream_eos (GMimeStream *stream) +{ + GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + + if (fstream->fp == NULL) + return TRUE; + + if (stream->bound_end == -1) + return feof (fstream->fp) ? TRUE : FALSE; + else + return stream->position >= stream->bound_end; +} + +static int +stream_reset (GMimeStream *stream) +{ + GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + + if (fstream->fp == NULL) { + errno = EBADF; + return -1; + } + + if (stream->position == stream->bound_start) + return 0; + + if (fseek (fstream->fp, (long) stream->bound_start, SEEK_SET) == -1) + return -1; + + return 0; +} + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + gint64 real = stream->position; + FILE *fp = fstream->fp; + + if (fstream->fp == NULL) { + errno = EBADF; + return -1; + } + + switch (whence) { + case GMIME_STREAM_SEEK_SET: + real = offset; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; + break; + case GMIME_STREAM_SEEK_END: + if (offset > 0 || (stream->bound_end == -1 && !feof (fp))) { + /* need to do an actual lseek() here because + * we either don't know the offset of the end + * of the stream and/or don't know if we can + * seek past the end */ + if (fseek (fp, (long) offset, SEEK_END) == -1 || (real = ftell (fp)) == -1) + return -1; + } else if (feof (fp) && stream->bound_end == -1) { + /* seeking backwards from eos (which happens + * to be our current position) */ + real = stream->position + offset; + } else { + /* seeking backwards from a known position */ + real = stream->bound_end + offset; + } + break; + } + + /* sanity check the resultant offset */ + if (real < stream->bound_start) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1 && real > stream->bound_end) { + errno = EINVAL; + return -1; + } + + if (fseek (fp, (long) real, SEEK_SET) == -1 || (real = ftell (fp)) == -1) + return -1; + + stream->position = real; + + return real; +} + +static gint64 +stream_tell (GMimeStream *stream) +{ + return stream->position; +} + +static gint64 +stream_length (GMimeStream *stream) +{ + GMimeStreamFile *fstream = (GMimeStreamFile *) stream; + gint64 bound_end; + + if (fstream->fp == NULL) { + errno = EBADF; + return -1; + } + + if (stream->bound_start != -1 && stream->bound_end != -1) + return stream->bound_end - stream->bound_start; + + fseek (fstream->fp, (long) 0, SEEK_END); + bound_end = ftell (fstream->fp); + fseek (fstream->fp, (long) stream->position, SEEK_SET); + + if (bound_end < stream->bound_start) { + errno = EINVAL; + return -1; + } + + return bound_end - stream->bound_start; +} + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + GMimeStreamFile *fstream; + + fstream = g_object_newv (GMIME_TYPE_STREAM_FILE, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (fstream), start, end); + fstream->owner = FALSE; + fstream->fp = GMIME_STREAM_FILE (stream)->fp; + + return GMIME_STREAM (fstream); +} + + +/** + * g_mime_stream_file_new: + * @fp: a FILE pointer + * + * Creates a new #GMimeStreamFile object around @fp. + * + * Note: The created #GMimeStreamFile object will own the FILE pointer + * passed in. + * + * Returns: a stream using @fp. + **/ +GMimeStream * +g_mime_stream_file_new (FILE *fp) +{ + GMimeStreamFile *fstream; + gint64 start; + +#ifdef G_OS_WIN32 + _setmode (_fileno (fp), O_BINARY); +#endif + + if ((start = ftell (fp)) == -1) + start = 0; + + fstream = g_object_newv (GMIME_TYPE_STREAM_FILE, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (fstream), start, -1); + fstream->owner = TRUE; + fstream->fp = fp; + + return GMIME_STREAM (fstream); +} + + +/** + * g_mime_stream_file_new_with_bounds: + * @fp: a FILE pointer + * @start: start boundary + * @end: end boundary + * + * Creates a new #GMimeStreamFile object around @fp with bounds @start + * and @end. + * + * Note: The created #GMimeStreamFile object will own the FILE pointer + * passed in. + * + * Returns: a stream using @fp with bounds @start and @end. + **/ +GMimeStream * +g_mime_stream_file_new_with_bounds (FILE *fp, gint64 start, gint64 end) +{ + GMimeStreamFile *fstream; + +#ifdef G_OS_WIN32 + _setmode (_fileno (fp), O_BINARY); +#endif + + fstream = g_object_newv (GMIME_TYPE_STREAM_FILE, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (fstream), start, end); + fstream->owner = TRUE; + fstream->fp = fp; + + return GMIME_STREAM (fstream); +} + + +/** + * g_mime_stream_file_get_owner: + * @stream: a #GMimeStreamFile + * + * Gets whether or not @stream owns the backend FILE pointer. + * + * Returns: %TRUE if @stream owns the backend FILE pointer or %FALSE + * otherwise. + **/ +gboolean +g_mime_stream_file_get_owner (GMimeStreamFile *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM_FILE (stream), FALSE); + + return stream->owner; +} + + +/** + * g_mime_stream_file_set_owner: + * @stream: a #GMimeStreamFile + * @owner: %TRUE if this stream should own the FILE pointer or %FALSE otherwise + * + * Sets whether or not @stream owns the backend FILE pointer. + * + * Note: @owner should be %TRUE if the stream should fclose() the + * backend FILE pointer when destroyed or %FALSE otherwise. + **/ +void +g_mime_stream_file_set_owner (GMimeStreamFile *stream, gboolean owner) +{ + g_return_if_fail (GMIME_IS_STREAM_FILE (stream)); + + stream->owner = owner; +} diff --git a/gmime/gmime-stream-file.h b/gmime/gmime-stream-file.h new file mode 100644 index 0000000..6202f24 --- /dev/null +++ b/gmime/gmime-stream-file.h @@ -0,0 +1,72 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_FILE_H__ +#define __GMIME_STREAM_FILE_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM_FILE (g_mime_stream_file_get_type ()) +#define GMIME_STREAM_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM_FILE, GMimeStreamFile)) +#define GMIME_STREAM_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM_FILE, GMimeStreamFileClass)) +#define GMIME_IS_STREAM_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM_FILE)) +#define GMIME_IS_STREAM_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM_FILE)) +#define GMIME_STREAM_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM_FILE, GMimeStreamFileClass)) + +typedef struct _GMimeStreamFile GMimeStreamFile; +typedef struct _GMimeStreamFileClass GMimeStreamFileClass; + +/** + * GMimeStreamFile: + * @parent_object: parent #GMimeStream + * @owner: %TRUE if this stream owns @fd + * @fp: standard-c FILE pointer + * + * A #GMimeStream wrapper around standard-c FILE pointers. + **/ +struct _GMimeStreamFile { + GMimeStream parent_object; + + gboolean owner; + FILE *fp; +}; + +struct _GMimeStreamFileClass { + GMimeStreamClass parent_class; + +}; + + +GType g_mime_stream_file_get_type (void); + +GMimeStream *g_mime_stream_file_new (FILE *fp); +GMimeStream *g_mime_stream_file_new_with_bounds (FILE *fp, gint64 start, gint64 end); + +gboolean g_mime_stream_file_get_owner (GMimeStreamFile *stream); +void g_mime_stream_file_set_owner (GMimeStreamFile *stream, gboolean owner); + +G_END_DECLS + +#endif /* __GMIME_STREAM_FILE_H__ */ diff --git a/gmime/gmime-stream-filter.c b/gmime/gmime-stream-filter.c new file mode 100644 index 0000000..f050ec1 --- /dev/null +++ b/gmime/gmime-stream-filter.c @@ -0,0 +1,499 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-stream-filter.h" + + +/** + * SECTION: gmime-stream-filter + * @title: GMimeStreamFilter + * @short_description: A filtering stream + * @see_also: #Filters + * + * A #GMimeStream meant for filtering data passing through it. + * + * This stream class is useful for converting data of one type to + * another using #GMimeFilter objects. + * + * When data passes through a #GMimeStreamFilter, it will pass through + * #GMimeFilter filters in the order they were added. + **/ + + +#define READ_PAD (64) /* bytes padded before buffer */ +#define READ_SIZE (4096) + +#define _PRIVATE(o) (((GMimeStreamFilter *)(o))->priv) + +struct _filter { + struct _filter *next; + GMimeFilter *filter; + int id; +}; + +struct _GMimeStreamFilterPrivate { + struct _filter *filters; + int filterid; /* next filter id */ + + char *realbuffer; /* buffer - READ_PAD */ + char *buffer; /* READ_SIZE bytes */ + + char *filtered; /* the filtered data */ + size_t filteredlen; + + int last_was_read:1; /* was the last op read or write? */ + int flushed:1; /* have the filters been flushed? */ +}; + +static void g_mime_stream_filter_class_init (GMimeStreamFilterClass *klass); +static void g_mime_stream_filter_init (GMimeStreamFilter *stream, GMimeStreamFilterClass *klass); +static void g_mime_stream_filter_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t n); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t n); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GMimeStreamClass *parent_class = NULL; + + +GType +g_mime_stream_filter_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamFilterClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_filter_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStreamFilter), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_filter_init, + }; + + type = g_type_register_static (GMIME_TYPE_STREAM, "GMimeStreamFilter", &info, 0); + } + + return type; +} + + +static void +g_mime_stream_filter_class_init (GMimeStreamFilterClass *klass) +{ + GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_STREAM); + + object_class->finalize = g_mime_stream_filter_finalize; + + stream_class->read = stream_read; + stream_class->write = stream_write; + stream_class->flush = stream_flush; + stream_class->close = stream_close; + stream_class->eos = stream_eos; + stream_class->reset = stream_reset; + stream_class->seek = stream_seek; + stream_class->tell = stream_tell; + stream_class->length = stream_length; + stream_class->substream = stream_substream; +} + +static void +g_mime_stream_filter_init (GMimeStreamFilter *stream, GMimeStreamFilterClass *klass) +{ + stream->source = NULL; + stream->priv = g_new (struct _GMimeStreamFilterPrivate, 1); + stream->priv->filters = NULL; + stream->priv->filterid = 0; + stream->priv->realbuffer = g_malloc (READ_SIZE + READ_PAD); + stream->priv->buffer = stream->priv->realbuffer + READ_PAD; + stream->priv->last_was_read = TRUE; + stream->priv->filteredlen = 0; + stream->priv->flushed = FALSE; +} + +static void +g_mime_stream_filter_finalize (GObject *object) +{ + GMimeStreamFilter *filter = (GMimeStreamFilter *) object; + struct _GMimeStreamFilterPrivate *p = filter->priv; + struct _filter *fn, *f; + + f = p->filters; + while (f) { + fn = f->next; + g_object_unref (f->filter); + g_free (f); + f = fn; + } + + g_free (p->realbuffer); + g_free (p); + + if (filter->source) + g_object_unref (filter->source); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t n) +{ + GMimeStreamFilter *filter = (GMimeStreamFilter *) stream; + struct _GMimeStreamFilterPrivate *priv = filter->priv; + struct _filter *f; + ssize_t nread; + + priv->last_was_read = TRUE; + + if (priv->filteredlen <= 0) { + size_t presize = READ_PAD; + + nread = g_mime_stream_read (filter->source, priv->buffer, READ_SIZE); + if (nread <= 0) { + /* this is somewhat untested */ + if (g_mime_stream_eos (filter->source) && !priv->flushed) { + priv->filtered = priv->buffer; + priv->filteredlen = 0; + f = priv->filters; + + while (f != NULL) { + g_mime_filter_complete (f->filter, priv->filtered, priv->filteredlen, + presize, &priv->filtered, &priv->filteredlen, + &presize); + f = f->next; + } + + nread = priv->filteredlen; + priv->flushed = TRUE; + } + + if (nread <= 0) + return nread; + } else { + priv->filtered = priv->buffer; + priv->filteredlen = nread; + priv->flushed = FALSE; + f = priv->filters; + + while (f != NULL) { + g_mime_filter_filter (f->filter, priv->filtered, priv->filteredlen, presize, + &priv->filtered, &priv->filteredlen, &presize); + + f = f->next; + } + } + } + + nread = MIN (n, priv->filteredlen); + memcpy (buf, priv->filtered, nread); + priv->filteredlen -= nread; + priv->filtered += nread; + + return nread; +} + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t n) +{ + GMimeStreamFilter *filter = (GMimeStreamFilter *) stream; + struct _GMimeStreamFilterPrivate *priv = filter->priv; + char *buffer = (char *) buf; + ssize_t nwritten = n; + struct _filter *f; + size_t presize; + + priv->last_was_read = FALSE; + priv->flushed = FALSE; + + f = priv->filters; + presize = 0; + while (f != NULL) { + g_mime_filter_filter (f->filter, buffer, n, presize, &buffer, &n, &presize); + + f = f->next; + } + + if (g_mime_stream_write (filter->source, buffer, n) == -1) + return -1; + + /* return original input len because that's what our caller expects */ + return nwritten; +} + +static int +stream_flush (GMimeStream *stream) +{ + GMimeStreamFilter *filter = (GMimeStreamFilter *) stream; + struct _GMimeStreamFilterPrivate *priv = filter->priv; + size_t presize, len; + struct _filter *f; + char *buffer; + + if (priv->last_was_read) { + /* no-op */ + return 0; + } + + buffer = ""; + len = 0; + presize = 0; + f = priv->filters; + + while (f != NULL) { + g_mime_filter_complete (f->filter, buffer, len, presize, &buffer, &len, &presize); + + f = f->next; + } + + if (len > 0 && g_mime_stream_write (filter->source, buffer, len) == -1) + return -1; + + return g_mime_stream_flush (filter->source); +} + +static int +stream_close (GMimeStream *stream) +{ + GMimeStreamFilter *filter = (GMimeStreamFilter *) stream; + struct _GMimeStreamFilterPrivate *priv = filter->priv; + + if (!priv->last_was_read) + stream_flush (stream); + + return g_mime_stream_close (filter->source); +} + +static gboolean +stream_eos (GMimeStream *stream) +{ + GMimeStreamFilter *filter = (GMimeStreamFilter *) stream; + struct _GMimeStreamFilterPrivate *priv = filter->priv; + + if (priv->filteredlen > 0) + return FALSE; + + if (!priv->flushed) + return FALSE; + + return g_mime_stream_eos (filter->source); +} + +static int +stream_reset (GMimeStream *stream) +{ + GMimeStreamFilter *filter = (GMimeStreamFilter *) stream; + struct _GMimeStreamFilterPrivate *priv = filter->priv; + struct _filter *f; + + if (g_mime_stream_reset (filter->source) == -1) + return -1; + + priv->filteredlen = 0; + priv->flushed = FALSE; + + /* and reset filters */ + f = priv->filters; + while (f != NULL) { + g_mime_filter_reset (f->filter); + f = f->next; + } + + return 0; +} + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + return -1; +} + +static gint64 +stream_tell (GMimeStream *stream) +{ + return -1; +} + +static gint64 +stream_length (GMimeStream *stream) +{ + return stream->bound_end - stream->bound_start; +} + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + GMimeStreamFilter *filter = (GMimeStreamFilter *) stream; + GMimeStreamFilter *sub; + + sub = g_object_newv (GMIME_TYPE_STREAM_FILTER, 0, NULL); + sub->source = filter->source; + g_object_ref (sub->source); + + if (filter->priv->filters) { + struct _filter *f, *sn, *s = NULL; + + f = filter->priv->filters; + while (f) { + sn = g_new (struct _filter, 1); + sn->filter = g_mime_filter_copy (f->filter); + sn->id = f->id; + + if (s) { + s->next = sn; + s = sn; + } else { + s = sub->priv->filters = sn; + } + + f = f->next; + } + + s->next = NULL; + + sub->priv->filterid = filter->priv->filterid; + } + + g_mime_stream_construct (GMIME_STREAM (filter), start, end); + + return GMIME_STREAM (sub); +} + + +/** + * g_mime_stream_filter_new: + * @stream: source stream + * + * Creates a new #GMimeStreamFilter object using @stream as the source + * stream. + * + * Returns: a new filter stream with @stream as its source. + **/ +GMimeStream * +g_mime_stream_filter_new (GMimeStream *stream) +{ + GMimeStreamFilter *filter; + + g_return_val_if_fail (GMIME_IS_STREAM (stream), NULL); + + filter = g_object_newv (GMIME_TYPE_STREAM_FILTER, 0, NULL); + filter->source = stream; + g_object_ref (stream); + + g_mime_stream_construct (GMIME_STREAM (filter), + stream->bound_start, + stream->bound_end); + + return GMIME_STREAM (filter); +} + + +/** + * g_mime_stream_filter_add: + * @stream: a #GMimeStreamFilter + * @filter: a #GMimeFilter + * + * Adds @filter to @stream. Filters are applied in the same order in + * which they are added. + * + * Returns: an id for the filter. + **/ +int +g_mime_stream_filter_add (GMimeStreamFilter *stream, GMimeFilter *filter) +{ + struct _GMimeStreamFilterPrivate *priv; + struct _filter *f, *fn; + + g_return_val_if_fail (GMIME_IS_STREAM_FILTER (stream), -1); + g_return_val_if_fail (GMIME_IS_FILTER (filter), -1); + + g_object_ref (filter); + + priv = stream->priv; + + fn = g_new (struct _filter, 1); + fn->next = NULL; + fn->filter = filter; + fn->id = priv->filterid++; + + f = (struct _filter *) &priv->filters; + while (f->next) + f = f->next; + + f->next = fn; + fn->next = NULL; + + return fn->id; +} + + +/** + * g_mime_stream_filter_remove: + * @stream: a #GMimeStreamFilter + * @id: filter id + * + * Removed a filter from the stream based on the id (as returned from + * filter_add). + **/ +void +g_mime_stream_filter_remove (GMimeStreamFilter *stream, int id) +{ + struct _GMimeStreamFilterPrivate *priv; + struct _filter *f, *fn; + + g_return_if_fail (GMIME_IS_STREAM_FILTER (stream)); + + priv = stream->priv; + + if (id == -1) + return; + + f = (struct _filter *) &priv->filters; + while (f && f->next) { + fn = f->next; + if (fn->id == id) { + f->next = fn->next; + g_object_unref (fn->filter); + g_free (fn); + } + f = f->next; + } +} diff --git a/gmime/gmime-stream-filter.h b/gmime/gmime-stream-filter.h new file mode 100644 index 0000000..f6aa9cb --- /dev/null +++ b/gmime/gmime-stream-filter.h @@ -0,0 +1,71 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_FILTER_H__ +#define __GMIME_STREAM_FILTER_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM_FILTER (g_mime_stream_filter_get_type ()) +#define GMIME_STREAM_FILTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM_FILTER, GMimeStreamFilter)) +#define GMIME_STREAM_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM_FILTER, GMimeStreamFilterClass)) +#define GMIME_IS_STREAM_FILTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM_FILTER)) +#define GMIME_IS_STREAM_FILTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM_FILTER)) +#define GMIME_STREAM_FILTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM_FILTER, GMimeStreamFilterClass)) + +typedef struct _GMimeStreamFilter GMimeStreamFilter; +typedef struct _GMimeStreamFilterClass GMimeStreamFilterClass; + +/** + * GMimeStreamFilter: + * @parent_object: parent #GMimeStream + * @priv: private state data + * @source: source stream + * + * A #GMimeStream which passes data through any #GMimeFilter objects. + **/ +struct _GMimeStreamFilter { + GMimeStream parent_object; + + struct _GMimeStreamFilterPrivate *priv; + + GMimeStream *source; +}; + +struct _GMimeStreamFilterClass { + GMimeStreamClass parent_class; + +}; + + +GType g_mime_stream_filter_get_type (void); + +GMimeStream *g_mime_stream_filter_new (GMimeStream *stream); + +int g_mime_stream_filter_add (GMimeStreamFilter *stream, GMimeFilter *filter); +void g_mime_stream_filter_remove (GMimeStreamFilter *stream, int id); + +G_END_DECLS + +#endif /* __GMIME_STREAM_FILTER_H__ */ diff --git a/gmime/gmime-stream-fs.c b/gmime/gmime-stream-fs.c new file mode 100644 index 0000000..e9e995e --- /dev/null +++ b/gmime/gmime-stream-fs.c @@ -0,0 +1,500 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include +#include + +#include "gmime-stream-fs.h" + +#ifndef HAVE_FSYNC +#ifdef G_OS_WIN32 +/* _commit() is the equivalent of fsync() on Windows, but it aborts the + * program if the fd is a tty, so we'll just no-op for now... */ +static int fsync (int fd) { return 0; } +#else +static int fsync (int fd) { return 0; } +#endif +#endif + + +/** + * SECTION: gmime-stream-fs + * @title: GMimeStreamFs + * @short_description: A low-level FileSystem stream + * @see_also: #GMimeStream + * + * A simple #GMimeStream implementation that sits on top of the + * low-level UNIX file descriptor based I/O layer. + **/ + + +static void g_mime_stream_fs_class_init (GMimeStreamFsClass *klass); +static void g_mime_stream_fs_init (GMimeStreamFs *stream, GMimeStreamFsClass *klass); +static void g_mime_stream_fs_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GMimeStreamClass *parent_class = NULL; + + +GType +g_mime_stream_fs_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamFsClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_fs_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStreamFs), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_fs_init, + }; + + type = g_type_register_static (GMIME_TYPE_STREAM, "GMimeStreamFs", &info, 0); + } + + return type; +} + + +static void +g_mime_stream_fs_class_init (GMimeStreamFsClass *klass) +{ + GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_STREAM); + + object_class->finalize = g_mime_stream_fs_finalize; + + stream_class->read = stream_read; + stream_class->write = stream_write; + stream_class->flush = stream_flush; + stream_class->close = stream_close; + stream_class->eos = stream_eos; + stream_class->reset = stream_reset; + stream_class->seek = stream_seek; + stream_class->tell = stream_tell; + stream_class->length = stream_length; + stream_class->substream = stream_substream; +} + +static void +g_mime_stream_fs_init (GMimeStreamFs *stream, GMimeStreamFsClass *klass) +{ + stream->owner = TRUE; + stream->eos = FALSE; + stream->fd = -1; +} + +static void +g_mime_stream_fs_finalize (GObject *object) +{ + GMimeStreamFs *stream = (GMimeStreamFs *) object; + + if (stream->owner && stream->fd != -1) + close (stream->fd); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t len) +{ + GMimeStreamFs *fs = (GMimeStreamFs *) stream; + ssize_t nread; + + if (fs->fd == -1) { + errno = EBADF; + return -1; + } + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1) + len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); + + /* make sure we are at the right position */ + lseek (fs->fd, (off_t) stream->position, SEEK_SET); + + do { + nread = read (fs->fd, buf, len); + } while (nread == -1 && errno == EINTR); + + if (nread > 0) { + stream->position += nread; + } else if (nread == 0) { + fs->eos = TRUE; + } + + return nread; +} + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + GMimeStreamFs *fs = (GMimeStreamFs *) stream; + size_t nwritten = 0; + ssize_t n; + + if (fs->fd == -1) { + errno = EBADF; + return -1; + } + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1) + len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); + + /* make sure we are at the right position */ + lseek (fs->fd, (off_t) stream->position, SEEK_SET); + + do { + do { + n = write (fs->fd, buf + nwritten, len - nwritten); + } while (n == -1 && (errno == EINTR || errno == EAGAIN)); + + if (n > 0) + nwritten += n; + } while (n != -1 && nwritten < len); + + if (n == -1 && (errno == EFBIG || errno == ENOSPC)) + fs->eos = TRUE; + + if (nwritten > 0) { + stream->position += nwritten; + } else if (n == -1) { + /* error and nothing written */ + return -1; + } + + return nwritten; +} + +static int +stream_flush (GMimeStream *stream) +{ + GMimeStreamFs *fs = (GMimeStreamFs *) stream; + + if (fs->fd == -1) { + errno = EBADF; + return -1; + } + + return fsync (fs->fd); +} + +static int +stream_close (GMimeStream *stream) +{ + GMimeStreamFs *fs = (GMimeStreamFs *) stream; + int rv; + + if (fs->fd == -1) + return 0; + + do { + if ((rv = close (fs->fd)) == 0) + fs->fd = -1; + } while (rv == -1 && errno == EINTR); + + return rv; +} + +static gboolean +stream_eos (GMimeStream *stream) +{ + GMimeStreamFs *fs = (GMimeStreamFs *) stream; + + if (fs->fd == -1) + return TRUE; + + return fs->eos; +} + +static int +stream_reset (GMimeStream *stream) +{ + GMimeStreamFs *fs = (GMimeStreamFs *) stream; + + if (fs->fd == -1) { + errno = EBADF; + return -1; + } + + if (stream->position == stream->bound_start) { + fs->eos = FALSE; + return 0; + } + + /* FIXME: if stream_read/write is always going to lseek to + * make sure fd's seek position matches our own, we could just + * set stream->position = stream->bound_start and be done. */ + if (lseek (fs->fd, (off_t) stream->bound_start, SEEK_SET) == -1) + return -1; + + fs->eos = FALSE; + + return 0; +} + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamFs *fs = (GMimeStreamFs *) stream; + gint64 real; + + if (fs->fd == -1) { + errno = EBADF; + return -1; + } + + switch (whence) { + case GMIME_STREAM_SEEK_SET: + real = offset; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; + break; + case GMIME_STREAM_SEEK_END: + if (offset > 0 || (stream->bound_end == -1 && !fs->eos)) { + /* need to do an actual lseek() here because + * we either don't know the offset of the end + * of the stream and/or don't know if we can + * seek past the end */ + if ((real = lseek (fs->fd, (off_t) offset, SEEK_END)) == -1) + return -1; + } else if (fs->eos && stream->bound_end == -1) { + /* seeking backwards from eos (which happens + * to be our current position) */ + real = stream->position + offset; + } else { + /* seeking backwards from a known position */ + real = stream->bound_end + offset; + } + + break; + default: + g_assert_not_reached (); + return -1; + } + + /* sanity check the resultant offset */ + if (real < stream->bound_start) { + errno = EINVAL; + return -1; + } + + /* short-cut if we are seeking to our current position */ + if (real == stream->position) + return real; + + if (stream->bound_end != -1 && real > stream->bound_end) { + errno = EINVAL; + return -1; + } + + if ((real = lseek (fs->fd, (off_t) real, SEEK_SET)) == -1) + return -1; + + /* reset eos if appropriate */ + if ((stream->bound_end != -1 && real < stream->bound_end) || + (fs->eos && real < stream->position)) + fs->eos = FALSE; + + stream->position = real; + + return real; +} + +static gint64 +stream_tell (GMimeStream *stream) +{ + return stream->position; +} + +static gint64 +stream_length (GMimeStream *stream) +{ + GMimeStreamFs *fs = (GMimeStreamFs *) stream; + gint64 bound_end; + + if (fs->fd == -1) { + errno = EBADF; + return -1; + } + + if (stream->bound_end != -1) + return stream->bound_end - stream->bound_start; + + bound_end = lseek (fs->fd, (off_t) 0, SEEK_END); + lseek (fs->fd, (off_t) stream->position, SEEK_SET); + + if (bound_end < stream->bound_start) { + errno = EINVAL; + return -1; + } + + return bound_end - stream->bound_start; +} + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + GMimeStreamFs *fs; + + fs = g_object_newv (GMIME_TYPE_STREAM_FS, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (fs), start, end); + fs->fd = GMIME_STREAM_FS (stream)->fd; + fs->owner = FALSE; + fs->eos = FALSE; + + return (GMimeStream *) fs; +} + + +/** + * g_mime_stream_fs_new: + * @fd: a file descriptor + * + * Creates a new #GMimeStreamFs object around @fd. + * + * Returns: a stream using @fd. + **/ +GMimeStream * +g_mime_stream_fs_new (int fd) +{ + GMimeStreamFs *fs; + gint64 start; + +#ifdef G_OS_WIN32 + _setmode (fd, O_BINARY); +#endif + + if ((start = lseek (fd, (off_t) 0, SEEK_CUR)) == -1) + start = 0; + + fs = g_object_newv (GMIME_TYPE_STREAM_FS, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (fs), start, -1); + fs->owner = TRUE; + fs->eos = FALSE; + fs->fd = fd; + + return (GMimeStream *) fs; +} + + +/** + * g_mime_stream_fs_new_with_bounds: + * @fd: a file descriptor + * @start: start boundary + * @end: end boundary + * + * Creates a new #GMimeStreamFs object around @fd with bounds @start + * and @end. + * + * Returns: a stream using @fd with bounds @start and @end. + **/ +GMimeStream * +g_mime_stream_fs_new_with_bounds (int fd, gint64 start, gint64 end) +{ + GMimeStreamFs *fs; + +#ifdef G_OS_WIN32 + _setmode (fd, O_BINARY); +#endif + + fs = g_object_newv (GMIME_TYPE_STREAM_FS, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (fs), start, end); + fs->owner = TRUE; + fs->eos = FALSE; + fs->fd = fd; + + return (GMimeStream *) fs; +} + + +/** + * g_mime_stream_fs_get_owner: + * @stream: a #GMimeStreamFs + * + * Gets whether or not @stream owns the backend file descriptor. + * + * Returns: %TRUE if @stream owns the backend file descriptor or %FALSE + * otherwise. + **/ +gboolean +g_mime_stream_fs_get_owner (GMimeStreamFs *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM_FS (stream), FALSE); + + return stream->owner; +} + + +/** + * g_mime_stream_fs_set_owner: + * @stream: a #GMimeStreamFs + * @owner: %TRUE if this stream should own the file descriptor or %FALSE otherwise + * + * Sets whether or not @stream owns the backend file descriptor. + * + * Note: @owner should be %TRUE if the stream should close() the + * backend file descriptor when destroyed or %FALSE otherwise. + **/ +void +g_mime_stream_fs_set_owner (GMimeStreamFs *stream, gboolean owner) +{ + g_return_if_fail (GMIME_IS_STREAM_FS (stream)); + + stream->owner = owner; +} diff --git a/gmime/gmime-stream-fs.h b/gmime/gmime-stream-fs.h new file mode 100644 index 0000000..67f9c3f --- /dev/null +++ b/gmime/gmime-stream-fs.h @@ -0,0 +1,72 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_FS_H__ +#define __GMIME_STREAM_FS_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM_FS (g_mime_stream_fs_get_type ()) +#define GMIME_STREAM_FS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM_FS, GMimeStreamFs)) +#define GMIME_STREAM_FS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM_FS, GMimeStreamFsClass)) +#define GMIME_IS_STREAM_FS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM_FS)) +#define GMIME_IS_STREAM_FS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM_FS)) +#define GMIME_STREAM_FS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM_FS, GMimeStreamFsClass)) + +typedef struct _GMimeStreamFs GMimeStreamFs; +typedef struct _GMimeStreamFsClass GMimeStreamFsClass; + +/** + * GMimeStreamFs: + * @parent_object: parent #GMimeStream + * @owner: %TRUE if this stream owns @fd + * @eos: %TRUE if end-of-stream + * @fd: file descriptor + * + * A #GMimeStream wrapper around POSIX file descriptors. + **/ +struct _GMimeStreamFs { + GMimeStream parent_object; + + gboolean owner; + gboolean eos; + int fd; +}; + +struct _GMimeStreamFsClass { + GMimeStreamClass parent_class; + +}; + + +GType g_mime_stream_fs_get_type (void); + +GMimeStream *g_mime_stream_fs_new (int fd); +GMimeStream *g_mime_stream_fs_new_with_bounds (int fd, gint64 start, gint64 end); + +gboolean g_mime_stream_fs_get_owner (GMimeStreamFs *stream); +void g_mime_stream_fs_set_owner (GMimeStreamFs *stream, gboolean owner); + +G_END_DECLS + +#endif /* __GMIME_STREAM_FS_H__ */ diff --git a/gmime/gmime-stream-gio.c b/gmime/gmime-stream-gio.c new file mode 100644 index 0000000..370500b --- /dev/null +++ b/gmime/gmime-stream-gio.c @@ -0,0 +1,720 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include "gmime-stream-gio.h" + + +/** + * SECTION: gmime-stream-gio + * @title: GMimeStreamGIO + * @short_description: A wrapper for GLib's GIO streams + * @see_also: #GMimeStream + * + * A simple #GMimeStream implementation that sits on top of GLib's GIO + * input and output streams. + **/ + + +static void g_mime_stream_gio_class_init (GMimeStreamGIOClass *klass); +static void g_mime_stream_gio_init (GMimeStreamGIO *stream, GMimeStreamGIOClass *klass); +static void g_mime_stream_gio_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 ofgioet, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GMimeStreamClass *parent_class = NULL; + + +GType +g_mime_stream_gio_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamGIOClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_gio_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStreamGIO), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_gio_init, + }; + + type = g_type_register_static (GMIME_TYPE_STREAM, "GMimeStreamGIO", &info, 0); + } + + return type; +} + + +static void +g_mime_stream_gio_class_init (GMimeStreamGIOClass *klass) +{ + GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_STREAM); + + object_class->finalize = g_mime_stream_gio_finalize; + + stream_class->read = stream_read; + stream_class->write = stream_write; + stream_class->flush = stream_flush; + stream_class->close = stream_close; + stream_class->eos = stream_eos; + stream_class->reset = stream_reset; + stream_class->seek = stream_seek; + stream_class->tell = stream_tell; + stream_class->length = stream_length; + stream_class->substream = stream_substream; +} + +static void +g_mime_stream_gio_init (GMimeStreamGIO *stream, GMimeStreamGIOClass *klass) +{ + stream->ostream = NULL; + stream->istream = NULL; + stream->file = NULL; + + stream->owner = TRUE; + stream->eos = FALSE; +} + +static void +g_mime_stream_gio_finalize (GObject *object) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) object; + + if (gio->istream) { + g_input_stream_close (gio->istream, NULL, NULL); + g_object_unref (gio->istream); + } + + if (gio->ostream) { + g_output_stream_close (gio->ostream, NULL, NULL); + g_object_unref (gio->ostream); + } + + if (gio->owner && gio->file) + g_object_unref (gio->file); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +set_errno (GError *err) +{ + if (!err) { + errno = 0; + return; + } + + switch (err->code) { + case G_IO_ERROR_NOT_FOUND: errno = ENOENT; break; + case G_IO_ERROR_EXISTS: errno = EEXIST; break; + case G_IO_ERROR_IS_DIRECTORY: errno = EISDIR; break; + case G_IO_ERROR_NOT_DIRECTORY: errno = ENOTDIR; break; + case G_IO_ERROR_NOT_EMPTY: errno = ENOTEMPTY; break; + case G_IO_ERROR_FILENAME_TOO_LONG: errno = ENAMETOOLONG; break; + case G_IO_ERROR_TOO_MANY_LINKS: errno = EMLINK; break; + case G_IO_ERROR_NO_SPACE: errno = ENOSPC; break; // or ENOMEM + case G_IO_ERROR_INVALID_ARGUMENT: errno = EINVAL; break; + case G_IO_ERROR_PERMISSION_DENIED: errno = EACCES; break; // or EPERM +#ifdef ENOTSUP + case G_IO_ERROR_NOT_SUPPORTED: errno = ENOTSUP; break; +#endif +#ifdef ECANCELED + case G_IO_ERROR_CANCELLED: errno = ECANCELED; break; +#endif + case G_IO_ERROR_READ_ONLY: errno = EROFS; break; +#ifdef ETIMEDOUT + case G_IO_ERROR_TIMED_OUT: errno = ETIMEDOUT; break; +#endif + case G_IO_ERROR_BUSY: errno = EBUSY; break; + case G_IO_ERROR_WOULD_BLOCK: errno = EAGAIN; break; + case G_IO_ERROR_FAILED: + default: + errno = EIO; + break; + } + + g_error_free (err); +} + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t len) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) stream; + GError *err = NULL; + ssize_t nread; + + if (gio->file == NULL) { + errno = EBADF; + return -1; + } + + if (gio->istream == NULL) { + /* try opening an input stream */ + if (!(gio->istream = (GInputStream *) g_file_read (gio->file, NULL, &err))) { + set_errno (err); + return -1; + } + } + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1) + len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); + + /* make sure we are at the right position */ + if (G_IS_SEEKABLE (gio->istream)) { + GSeekable *seekable = (GSeekable *) gio->istream; + + if (!g_seekable_seek (seekable, stream->position, G_SEEK_SET, NULL, &err)) { + set_errno (err); + return -1; + } + } + + if ((nread = g_input_stream_read (gio->istream, buf, len, NULL, &err)) < 0) { + set_errno (err); + return -1; + } + + if (nread > 0) + stream->position += nread; + else if (nread == 0) + gio->eos = TRUE; + + return nread; +} + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) stream; + size_t nwritten = 0; + GError *err = NULL; + + if (gio->file == NULL) { + errno = EBADF; + return -1; + } + + if (gio->ostream == NULL) { + /* try opening an output stream */ + if (!(gio->ostream = (GOutputStream *) g_file_append_to (gio->file, G_FILE_CREATE_NONE, NULL, &err))) { + set_errno (err); + return -1; + } + } + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1) + len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); + + /* make sure we are at the right position */ + if (G_IS_SEEKABLE (gio->ostream)) { + GSeekable *seekable = (GSeekable *) gio->ostream; + + if (!g_seekable_seek (seekable, stream->position, G_SEEK_SET, NULL, &err)) { + set_errno (err); + return -1; + } + } + + if (!g_output_stream_write_all (gio->ostream, buf, len, &nwritten, NULL, &err)) { + set_errno (err); + gio->eos = TRUE; + + if (nwritten == 0) { + /* nothing was written, return error */ + return -1; + } + + errno = 0; + } + + if (nwritten > 0) + stream->position += nwritten; + + return nwritten; +} + +static int +stream_flush (GMimeStream *stream) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) stream; + GError *err = NULL; + + if (gio->file == NULL) { + errno = EBADF; + return -1; + } + + if (gio->ostream && !g_output_stream_flush (gio->ostream, NULL, &err)) { + set_errno (err); + return -1; + } + + return 0; +} + +static int +stream_close (GMimeStream *stream) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) stream; + + if (gio->istream) { + g_input_stream_close (gio->istream, NULL, NULL); + g_object_unref (gio->istream); + gio->istream = NULL; + } + + if (gio->ostream) { + g_output_stream_close (gio->ostream, NULL, NULL); + g_object_unref (gio->ostream); + gio->ostream = NULL; + } + + if (gio->owner && gio->file) + g_object_unref (gio->file); + + gio->file = NULL; + + return 0; +} + +static gboolean +stream_eos (GMimeStream *stream) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) stream; + + if (gio->file == NULL) + return TRUE; + + return gio->eos; +} + +static int +stream_reset (GMimeStream *stream) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) stream; + GError *err = NULL; + + if (gio->file == NULL) { + errno = EBADF; + return -1; + } + + if (stream->position == stream->bound_start) { + gio->eos = FALSE; + return 0; + } + + if (gio->istream != NULL) { + /* reset the input stream */ + if (!G_IS_SEEKABLE (gio->istream)) { + errno = EINVAL; + return -1; + } + + if (!g_seekable_seek ((GSeekable *) gio->istream, stream->bound_start, G_SEEK_SET, NULL, &err)) { + set_errno (err); + return -1; + } + } + + if (gio->ostream != NULL) { + /* reset the output stream */ + if (!G_IS_SEEKABLE (gio->ostream)) { + errno = EINVAL; + return -1; + } + + if (!g_seekable_seek ((GSeekable *) gio->ostream, stream->bound_start, G_SEEK_SET, NULL, &err)) { + set_errno (err); + return -1; + } + } + + gio->eos = FALSE; + + return 0; +} + +static gint64 +gio_seekable_seek (GMimeStream *stream, GSeekable *seekable, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) stream; + gboolean need_seek = TRUE; + GError *err = NULL; + gint64 real; + + switch (whence) { + case GMIME_STREAM_SEEK_SET: + real = offset; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; + break; + case GMIME_STREAM_SEEK_END: + if (offset > 0 || (stream->bound_end == -1 && !gio->eos)) { + /* need to do an actual lseek() here because + * we either don't know the offset of the end + * of the stream and/or don't know if we can + * seek past the end */ + if (!g_seekable_seek (seekable, offset, G_SEEK_END, NULL, &err)) { + set_errno (err); + return -1; + } + + need_seek = FALSE; + real = offset; + } else if (gio->eos && stream->bound_end == -1) { + /* seeking backwards from eos (which happens + * to be our current position) */ + real = stream->position + offset; + } else { + /* seeking backwards from a known position */ + real = stream->bound_end + offset; + } + + break; + default: + g_assert_not_reached (); + return -1; + } + + /* sanity check the resultant offset */ + if (real < stream->bound_start) { + errno = EINVAL; + return -1; + } + + /* short-cut if we are seeking to our current position */ + if (real == stream->position) + return real; + + if (stream->bound_end != -1 && real > stream->bound_end) { + errno = EINVAL; + return -1; + } + + if (need_seek && !g_seekable_seek (seekable, real, G_SEEK_SET, NULL, &err)) { + set_errno (err); + return -1; + } + + return real; +} + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) stream; + gint64 real; + + if (gio->file == NULL) { + errno = EBADF; + return -1; + } + + /* if either of our streams are unseekable, fail */ + if ((gio->istream != NULL && !G_IS_SEEKABLE (gio->istream)) || + (gio->ostream != NULL && !G_IS_SEEKABLE (gio->ostream))) { + errno = EINVAL; + return -1; + } + + if (gio->istream || gio->ostream) { + gint64 outreal = -1; + gint64 inreal = -1; + + if (gio->istream) { + /* seek on our input stream */ + if ((inreal = gio_seekable_seek (stream, (GSeekable *) gio->istream, offset, whence)) == -1) + return -1; + + if (gio->ostream == NULL) + outreal = inreal; + } + + if (gio->ostream) { + /* seek on our output stream */ + if ((outreal = gio_seekable_seek (stream, (GSeekable *) gio->istream, offset, whence)) == -1) + return -1; + + if (gio->istream == NULL) + inreal = outreal; + } + + if (outreal != inreal) { + } + + real = outreal; + } else { + /* no streams yet opened... */ + switch (whence) { + case GMIME_STREAM_SEEK_SET: + real = offset; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; + break; + case GMIME_STREAM_SEEK_END: + real = stream->bound_end + offset; + break; + default: + g_assert_not_reached (); + return -1; + } + + /* check that we haven't seekend beyond bound_end */ + if (stream->bound_end != -1 && real > stream->bound_end) { + errno = EINVAL; + return -1; + } + + /* check that we are within the starting bounds */ + if (real < stream->bound_start) { + errno = EINVAL; + return -1; + } + } + + /* reset eos if appropriate */ + if ((stream->bound_end != -1 && real < stream->bound_end) || + (gio->eos && real < stream->position)) + gio->eos = FALSE; + + stream->position = real; + + return real; +} + +static gint64 +stream_tell (GMimeStream *stream) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) stream; + + if (gio->file == NULL) { + errno = EBADF; + return -1; + } + + return stream->position; +} + +static gint64 +gio_seekable_bound_end (GMimeStream *stream, GSeekable *seekable) +{ + GError *err = NULL; + gint64 bound_end; + + if (!g_seekable_seek (seekable, 0, G_SEEK_END, NULL, &err)) { + set_errno (err); + return -1; + } + + bound_end = g_seekable_tell (seekable); + if (bound_end < stream->bound_start) { + errno = EINVAL; + return -1; + } + + if (!g_seekable_seek (seekable, stream->position, G_SEEK_SET, NULL, &err)) { + set_errno (err); + return -1; + } + + return bound_end; +} + +static gint64 +stream_length (GMimeStream *stream) +{ + GMimeStreamGIO *gio = (GMimeStreamGIO *) stream; + gint64 bound_end; + + if (gio->file == NULL) { + errno = EBADF; + return -1; + } + + if (stream->bound_end != -1) + return stream->bound_end - stream->bound_start; + + if (gio->istream && G_IS_SEEKABLE (gio->istream)) { + if ((bound_end = gio_seekable_bound_end (stream, (GSeekable *) gio->istream)) == -1) + return -1; + } else if (gio->ostream && G_IS_SEEKABLE (gio->ostream)) { + if ((bound_end = gio_seekable_bound_end (stream, (GSeekable *) gio->ostream)) == -1) + return -1; + } else if (!gio->istream && !gio->ostream) { + /* try opening an input stream to get the length */ + if (!(gio->istream = (GInputStream *) g_file_read (gio->file, NULL, NULL))) { + errno = EINVAL; + return -1; + } + + if ((bound_end = gio_seekable_bound_end (stream, (GSeekable *) gio->istream)) == -1) + return -1; + } else { + /* neither of our streams is seekable, can't get the length */ + errno = EINVAL; + return -1; + } + + return bound_end - stream->bound_start; +} + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + GMimeStreamGIO *gio; + + gio = g_object_newv (GMIME_TYPE_STREAM_GIO, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (gio), start, end); + gio->file = GMIME_STREAM_GIO (stream)->file; + gio->owner = FALSE; + gio->eos = FALSE; + + return (GMimeStream *) gio; +} + + +/** + * g_mime_stream_gio_new: + * @file: a #GFile + * + * Creates a new #GMimeStreamGIO wrapper around a #GFile object. + * + * Returns: a stream using @file. + **/ +GMimeStream * +g_mime_stream_gio_new (GFile *file) +{ + GMimeStreamGIO *gio; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + gio = g_object_newv (GMIME_TYPE_STREAM_GIO, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (gio), 0, -1); + gio->file = file; + gio->owner = TRUE; + gio->eos = FALSE; + + return (GMimeStream *) gio; +} + + +/** + * g_mime_stream_gio_new_with_bounds: + * @file: a #GFile + * @start: start boundary + * @end: end boundary + * + * Creates a new #GMimeStreamGIO stream around a #GFile with bounds + * @start and @end. + * + * Returns: a stream using @file with bounds @start and @end. + **/ +GMimeStream * +g_mime_stream_gio_new_with_bounds (GFile *file, gint64 start, gint64 end) +{ + GMimeStreamGIO *gio; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + + gio = g_object_newv (GMIME_TYPE_STREAM_GIO, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (gio), start, end); + gio->file = file; + gio->owner = TRUE; + gio->eos = FALSE; + + return (GMimeStream *) gio; +} + + +/** + * g_mime_stream_gio_get_owner: + * @stream: a #GMimeStreamGIO stream + * + * Gets whether or not @stream owns the backend #GFile. + * + * Returns: %TRUE if @stream owns the backend #GFile or %FALSE + * otherwise. + **/ +gboolean +g_mime_stream_gio_get_owner (GMimeStreamGIO *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM_GIO (stream), FALSE); + + return stream->owner; +} + + +/** + * g_mime_stream_gio_set_owner: + * @stream: a #GMimeStreamGIO stream + * @owner: %TRUE if this stream should own the #GFile or %FALSE otherwise + * + * Sets whether or not @stream owns the backend GIO pointer. + * + * Note: @owner should be %TRUE if the stream should close() the + * backend file descriptor when destroyed or %FALSE otherwise. + **/ +void +g_mime_stream_gio_set_owner (GMimeStreamGIO *stream, gboolean owner) +{ + g_return_if_fail (GMIME_IS_STREAM_GIO (stream)); + + stream->owner = owner; +} diff --git a/gmime/gmime-stream-gio.h b/gmime/gmime-stream-gio.h new file mode 100644 index 0000000..1c32ce6 --- /dev/null +++ b/gmime/gmime-stream-gio.h @@ -0,0 +1,79 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_GIO_H__ +#define __GMIME_STREAM_GIO_H__ + +#include + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM_GIO (g_mime_stream_gio_get_type ()) +#define GMIME_STREAM_GIO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM_GIO, GMimeStreamGIO)) +#define GMIME_STREAM_GIO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM_GIO, GMimeStreamGIOClass)) +#define GMIME_IS_STREAM_GIO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM_GIO)) +#define GMIME_IS_STREAM_GIO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM_GIO)) +#define GMIME_STREAM_GIO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM_GIO, GMimeStreamGIOClass)) + +typedef struct _GMimeStreamGIO GMimeStreamGIO; +typedef struct _GMimeStreamGIOClass GMimeStreamGIOClass; + +/** + * GMimeStreamGIO: + * @parent_object: parent #GMimeStream + * @ostream: a #GOutputStream + * @istream: a #GInputStream + * @file: a #GFile + * @owner: %TRUE if this stream owns the #GFile or %FALSE otherwise + * @eos: %TRUE if the end of the stream has been reached or %FALSE otherwise + * + * A #GMimeStream wrapper around GLib's GIO streams. + **/ +struct _GMimeStreamGIO { + GMimeStream parent_object; + + GOutputStream *ostream; + GInputStream *istream; + GFile *file; + + gboolean owner; + gboolean eos; +}; + +struct _GMimeStreamGIOClass { + GMimeStreamClass parent_class; + +}; + + +GType g_mime_stream_gio_get_type (void); + +GMimeStream *g_mime_stream_gio_new (GFile *file); +GMimeStream *g_mime_stream_gio_new_with_bounds (GFile *file, gint64 start, gint64 end); + +gboolean g_mime_stream_gio_get_owner (GMimeStreamGIO *stream); +void g_mime_stream_gio_set_owner (GMimeStreamGIO *stream, gboolean owner); + +G_END_DECLS + +#endif /* __GMIME_STREAM_GIO_H__ */ diff --git a/gmime/gmime-stream-mem.c b/gmime/gmime-stream-mem.c new file mode 100644 index 0000000..044c2df --- /dev/null +++ b/gmime/gmime-stream-mem.c @@ -0,0 +1,483 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gmime-stream-mem.h" + + +/** + * SECTION: gmime-stream-mem + * @title: GMimeStreamMem + * @short_description: A memory-backed stream + * @see_also: #GMimeStream + * + * A simple #GMimeStream implementation that uses a memory buffer for + * storage. + **/ + + +static void g_mime_stream_mem_class_init (GMimeStreamMemClass *klass); +static void g_mime_stream_mem_init (GMimeStreamMem *stream, GMimeStreamMemClass *klass); +static void g_mime_stream_mem_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GMimeStreamClass *parent_class = NULL; + + +GType +g_mime_stream_mem_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamMemClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_mem_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStreamMem), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_mem_init, + }; + + type = g_type_register_static (GMIME_TYPE_STREAM, "GMimeStreamMem", &info, 0); + } + + return type; +} + + +static void +g_mime_stream_mem_class_init (GMimeStreamMemClass *klass) +{ + GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_STREAM); + + object_class->finalize = g_mime_stream_mem_finalize; + + stream_class->read = stream_read; + stream_class->write = stream_write; + stream_class->flush = stream_flush; + stream_class->close = stream_close; + stream_class->eos = stream_eos; + stream_class->reset = stream_reset; + stream_class->seek = stream_seek; + stream_class->tell = stream_tell; + stream_class->length = stream_length; + stream_class->substream = stream_substream; +} + +static void +g_mime_stream_mem_init (GMimeStreamMem *stream, GMimeStreamMemClass *klass) +{ + stream->owner = TRUE; + stream->buffer = NULL; +} + +static void +g_mime_stream_mem_finalize (GObject *object) +{ + GMimeStreamMem *stream = (GMimeStreamMem *) object; + + if (stream->owner && stream->buffer) + g_byte_array_free (stream->buffer, TRUE); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t len) +{ + GMimeStreamMem *mem = (GMimeStreamMem *) stream; + gint64 bound_end; + ssize_t n; + + if (mem->buffer == NULL) { + errno = EBADF; + return -1; + } + + bound_end = stream->bound_end != -1 ? stream->bound_end : (gint64) mem->buffer->len; + + n = (size_t) MIN (bound_end - stream->position, (gint64) len); + if (n > 0) { + memcpy (buf, mem->buffer->data + stream->position, n); + stream->position += n; + } else if (n < 0) { + errno = EINVAL; + n = -1; + } + + return n; +} + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + GMimeStreamMem *mem = (GMimeStreamMem *) stream; + gint64 bound_end; + ssize_t n; + + if (mem->buffer == NULL) { + errno = EBADF; + return -1; + } + + if (stream->bound_end == -1) { + if (stream->position + len > mem->buffer->len) + g_byte_array_set_size (mem->buffer, (guint) stream->position + len); + + bound_end = mem->buffer->len; + } else + bound_end = stream->bound_end; + + n = (size_t) MIN (bound_end - stream->position, (gint64) len); + if (n > 0) { + memcpy (mem->buffer->data + stream->position, buf, n); + stream->position += n; + } else if (n < 0) { + errno = EINVAL; + n = -1; + } + + return n; +} + +static int +stream_flush (GMimeStream *stream) +{ + GMimeStreamMem *mem = (GMimeStreamMem *) stream; + + if (mem->buffer == NULL) { + errno = EBADF; + return -1; + } + + return 0; +} + +static int +stream_close (GMimeStream *stream) +{ + GMimeStreamMem *mem = (GMimeStreamMem *) stream; + + if (mem->owner && mem->buffer) + g_byte_array_free (mem->buffer, TRUE); + + mem->buffer = NULL; + + return 0; +} + +static gboolean +stream_eos (GMimeStream *stream) +{ + GMimeStreamMem *mem = (GMimeStreamMem *) stream; + gint64 bound_end; + + if (mem->buffer == NULL) + return TRUE; + + bound_end = stream->bound_end != -1 ? stream->bound_end : (gint64) mem->buffer->len; + + return stream->position >= bound_end; +} + +static int +stream_reset (GMimeStream *stream) +{ + GMimeStreamMem *mem = (GMimeStreamMem *) stream; + + if (mem->buffer == NULL) { + errno = EBADF; + return -1; + } + + return 0; +} + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamMem *mem = (GMimeStreamMem *) stream; + gint64 bound_end, real = stream->position; + + if (mem->buffer == NULL) { + errno = EBADF; + return -1; + } + + bound_end = stream->bound_end != -1 ? stream->bound_end : (gint64) mem->buffer->len; + + switch (whence) { + case GMIME_STREAM_SEEK_SET: + real = offset; + break; + case GMIME_STREAM_SEEK_END: + real = offset + bound_end; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; + break; + } + + if (real < stream->bound_start) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1 && real > bound_end) { + errno = EINVAL; + return -1; + } + + if (real > bound_end) { + if (real > G_MAXUINT) { + errno = ENOSPC; + return -1; + } + + g_byte_array_set_size (mem->buffer, (guint) real); + } + + stream->position = real; + + return stream->position; +} + +static gint64 +stream_tell (GMimeStream *stream) +{ + GMimeStreamMem *mem = (GMimeStreamMem *) stream; + + if (mem->buffer == NULL) { + errno = EBADF; + return -1; + } + + return stream->position; +} + +static gint64 +stream_length (GMimeStream *stream) +{ + GMimeStreamMem *mem = GMIME_STREAM_MEM (stream); + gint64 bound_end; + + if (mem->buffer == NULL) { + errno = EBADF; + return -1; + } + + bound_end = stream->bound_end != -1 ? stream->bound_end : (gint64) mem->buffer->len; + + return bound_end - stream->bound_start; +} + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + GMimeStreamMem *mem; + + mem = g_object_newv (GMIME_TYPE_STREAM_MEM, 0, NULL); + g_mime_stream_construct ((GMimeStream *) mem, start, end); + mem->buffer = GMIME_STREAM_MEM (stream)->buffer; + mem->owner = FALSE; + + return (GMimeStream *) mem; +} + + +/** + * g_mime_stream_mem_new: + * + * Creates a new #GMimeStreamMem object. + * + * Returns: a new memory stream. + **/ +GMimeStream * +g_mime_stream_mem_new (void) +{ + GMimeStreamMem *mem; + + mem = g_object_newv (GMIME_TYPE_STREAM_MEM, 0, NULL); + g_mime_stream_construct ((GMimeStream *) mem, 0, -1); + mem->buffer = g_byte_array_new (); + mem->owner = TRUE; + + return (GMimeStream *) mem; +} + + +/** + * g_mime_stream_mem_new_with_byte_array: + * @array: source data + * + * Creates a new #GMimeStreamMem with data @array. + * + * Returns: a new memory stream using @array. + **/ +GMimeStream * +g_mime_stream_mem_new_with_byte_array (GByteArray *array) +{ + GMimeStreamMem *mem; + + mem = g_object_newv (GMIME_TYPE_STREAM_MEM, 0, NULL); + g_mime_stream_construct ((GMimeStream *) mem, 0, -1); + mem->buffer = array; + mem->owner = TRUE; + + return (GMimeStream *) mem; +} + + +/** + * g_mime_stream_mem_new_with_buffer: + * @buffer: stream data + * @len: buffer length + * + * Creates a new #GMimeStreamMem object and initializes the stream + * contents with the first @len bytes of @buffer. + * + * Returns: a new memory stream initialized with @buffer. + **/ +GMimeStream * +g_mime_stream_mem_new_with_buffer (const char *buffer, size_t len) +{ + GMimeStreamMem *mem; + + mem = g_object_newv (GMIME_TYPE_STREAM_MEM, 0, NULL); + g_mime_stream_construct ((GMimeStream *) mem, 0, -1); + mem->buffer = g_byte_array_new (); + mem->owner = TRUE; + + g_byte_array_append (mem->buffer, (unsigned char *) buffer, len); + + return (GMimeStream *) mem; +} + + +/** + * g_mime_stream_mem_get_byte_array: + * @mem: a #GMimeStreamMem + * + * Gets the byte array from the memory stream. + * + * Returns: the byte array from the memory stream. + **/ +GByteArray * +g_mime_stream_mem_get_byte_array (GMimeStreamMem *mem) +{ + g_return_val_if_fail (GMIME_IS_STREAM_MEM (mem), NULL); + + return mem->buffer; +} + + +/** + * g_mime_stream_mem_set_byte_array: + * @mem: a #GMimeStreamMem + * @array: stream data + * + * Sets the byte array on the memory stream. + * + * Note: The memory stream is not responsible for freeing the byte + * array. Use g_mime_stream_mem_set_owner() to change this behavior. + **/ +void +g_mime_stream_mem_set_byte_array (GMimeStreamMem *mem, GByteArray *array) +{ + GMimeStream *stream; + + g_return_if_fail (GMIME_IS_STREAM_MEM (mem)); + g_return_if_fail (array != NULL); + + if (mem->owner && mem->buffer) + g_byte_array_free (mem->buffer, TRUE); + + mem->buffer = array; + mem->owner = FALSE; + + stream = GMIME_STREAM (mem); + + stream->position = 0; + stream->bound_start = 0; + stream->bound_end = -1; +} + + +/** + * g_mime_stream_mem_get_owner: + * @mem: a #GMimeStreamMem + * + * Gets whether or not @mem owns the backend memory buffer. + * + * Returns: %TRUE if @mem owns the backend memory buffer or %FALSE + * otherwise. + **/ +gboolean +g_mime_stream_mem_get_owner (GMimeStreamMem *mem) +{ + g_return_val_if_fail (GMIME_IS_STREAM_MEM (mem), FALSE); + + return mem->owner; +} + + +/** + * g_mime_stream_mem_set_owner: + * @mem: a #GMimeStreamMem + * @owner: %TRUE if this stream should own the #GByteArray or %FALSE otherwise + * + * Sets whether or not @mem owns the backend memory buffer. + * + * Note: @owner should be %TRUE if the stream should free the backend + * memory buffer when destroyed or %FALSE otherwise. + **/ +void +g_mime_stream_mem_set_owner (GMimeStreamMem *mem, gboolean owner) +{ + g_return_if_fail (GMIME_IS_STREAM_MEM (mem)); + + mem->owner = owner; +} diff --git a/gmime/gmime-stream-mem.h b/gmime/gmime-stream-mem.h new file mode 100644 index 0000000..a6abc37 --- /dev/null +++ b/gmime/gmime-stream-mem.h @@ -0,0 +1,75 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_MEM_H__ +#define __GMIME_STREAM_MEM_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM_MEM (g_mime_stream_mem_get_type ()) +#define GMIME_STREAM_MEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM_MEM, GMimeStreamMem)) +#define GMIME_STREAM_MEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM_MEM, GMimeStreamMemClass)) +#define GMIME_IS_STREAM_MEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM_MEM)) +#define GMIME_IS_STREAM_MEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM_MEM)) +#define GMIME_STREAM_MEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM_MEM, GMimeStreamMemClass)) + +typedef struct _GMimeStreamMem GMimeStreamMem; +typedef struct _GMimeStreamMemClass GMimeStreamMemClass; + +/** + * GMimeStreamMem: + * @parent_object: parent #GMimeStream + * @buffer: a memory buffer + * @owner: %TRUE if this stream owns the memory buffer + * + * A memory-backed #GMimeStream. + **/ +struct _GMimeStreamMem { + GMimeStream parent_object; + + GByteArray *buffer; + gboolean owner; +}; + +struct _GMimeStreamMemClass { + GMimeStreamClass parent_class; + +}; + + +GType g_mime_stream_mem_get_type (void); + +GMimeStream *g_mime_stream_mem_new (void); +GMimeStream *g_mime_stream_mem_new_with_byte_array (GByteArray *array); +GMimeStream *g_mime_stream_mem_new_with_buffer (const char *buffer, size_t len); + +GByteArray *g_mime_stream_mem_get_byte_array (GMimeStreamMem *mem); +void g_mime_stream_mem_set_byte_array (GMimeStreamMem *mem, GByteArray *array); + +gboolean g_mime_stream_mem_get_owner (GMimeStreamMem *mem); +void g_mime_stream_mem_set_owner (GMimeStreamMem *mem, gboolean owner); + +G_END_DECLS + +#endif /* __GMIME_STREAM_MEM_H__ */ diff --git a/gmime/gmime-stream-mmap.c b/gmime/gmime-stream-mmap.c new file mode 100644 index 0000000..62c8784 --- /dev/null +++ b/gmime/gmime-stream-mmap.c @@ -0,0 +1,468 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#ifdef HAVE_SYS_MMAN_H +#include +#endif +#include +#include +#include + +#include "gmime-stream-mmap.h" + + +/** + * SECTION: gmime-stream-mmap + * @title: GMimeStreamMmap + * @short_description: A memory-mapped file stream + * @see_also: #GMimeStream + * + * A #GMimeStream implementation using a memory-mapped file backing + * store. This may be faster than #GMimeStreamFs or #GMimeStreamFile + * but you'll have to do your own performance checking to be sure for + * your particular application/platform. + **/ + + +static void g_mime_stream_mmap_class_init (GMimeStreamMmapClass *klass); +static void g_mime_stream_mmap_init (GMimeStreamMmap *stream, GMimeStreamMmapClass *klass); +static void g_mime_stream_mmap_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GMimeStreamClass *parent_class = NULL; + + +GType +g_mime_stream_mmap_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamMmapClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_mmap_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStreamMmap), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_mmap_init, + }; + + type = g_type_register_static (GMIME_TYPE_STREAM, "GMimeStreamMmap", &info, 0); + } + + return type; +} + + +static void +g_mime_stream_mmap_class_init (GMimeStreamMmapClass *klass) +{ + GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_STREAM); + + object_class->finalize = g_mime_stream_mmap_finalize; + + stream_class->read = stream_read; + stream_class->write = stream_write; + stream_class->flush = stream_flush; + stream_class->close = stream_close; + stream_class->eos = stream_eos; + stream_class->reset = stream_reset; + stream_class->seek = stream_seek; + stream_class->tell = stream_tell; + stream_class->length = stream_length; + stream_class->substream = stream_substream; +} + +static void +g_mime_stream_mmap_init (GMimeStreamMmap *stream, GMimeStreamMmapClass *klass) +{ + stream->owner = TRUE; + stream->eos = FALSE; + stream->fd = -1; + stream->map = NULL; + stream->maplen = 0; +} + +static void +g_mime_stream_mmap_finalize (GObject *object) +{ + GMimeStreamMmap *stream = (GMimeStreamMmap *) object; + + if (stream->owner) { +#ifdef HAVE_MUNMAP + if (stream->map) + munmap (stream->map, stream->maplen); +#endif + + if (stream->fd != -1) + close (stream->fd); + } + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t len) +{ + GMimeStreamMmap *mstream = (GMimeStreamMmap *) stream; + register char *mapptr; + ssize_t nread; + + if (mstream->fd == -1) { + errno = EBADF; + return -1; + } + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) { + errno = EINVAL; + return -1; + } + + /* make sure we are at the right position */ + mapptr = mstream->map + stream->position; + + if (stream->bound_end == -1) + nread = MIN ((gint64) ((mstream->map + mstream->maplen) - mapptr), (gint64) len); + else + nread = MIN (stream->bound_end - stream->position, (gint64) len); + + if (nread > 0) { + memcpy (buf, mapptr, nread); + stream->position += nread; + } else + mstream->eos = TRUE; + + return nread; +} + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + GMimeStreamMmap *mstream = (GMimeStreamMmap *) stream; + register char *mapptr; + ssize_t nwritten; + + if (mstream->fd == -1) { + errno = EBADF; + return -1; + } + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) { + errno = EINVAL; + return -1; + } + + /* make sure we are at the right position */ + mapptr = mstream->map + stream->position; + + if (stream->bound_end == -1) + nwritten = MIN ((gint64) ((mstream->map + mstream->maplen) - mapptr), (gint64) len); + else + nwritten = MIN (stream->bound_end - stream->position, (gint64) len); + + if (nwritten > 0) { + memcpy (mapptr, buf, nwritten); + stream->position += nwritten; + } + + return nwritten; +} + +static int +stream_flush (GMimeStream *stream) +{ + GMimeStreamMmap *mstream = (GMimeStreamMmap *) stream; + + if (mstream->fd == -1) { + errno = EBADF; + return -1; + } + +#ifdef HAVE_MSYNC + return msync (mstream->map, mstream->maplen, MS_SYNC /* | MS_INVALIDATE */); +#else + return 0; +#endif +} + +static int +stream_close (GMimeStream *stream) +{ + GMimeStreamMmap *mstream = (GMimeStreamMmap *) stream; + int ret = 0; + + if (mstream->owner && mstream->map) { +#ifdef HAVE_MUNMAP + munmap (mstream->map, mstream->maplen); + mstream->map = NULL; +#endif + } + + if (mstream->owner && mstream->fd != -1) { + if ((ret = close (mstream->fd)) != -1) + mstream->fd = -1; + } + + return ret; +} + +static gboolean +stream_eos (GMimeStream *stream) +{ + GMimeStreamMmap *mstream = (GMimeStreamMmap *) stream; + + if (mstream->fd == -1) + return TRUE; + + return mstream->eos; +} + +static int +stream_reset (GMimeStream *stream) +{ + GMimeStreamMmap *mstream = (GMimeStreamMmap *) stream; + + if (mstream->fd == -1) { + errno = EBADF; + return -1; + } + + mstream->eos = FALSE; + + return 0; +} + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamMmap *mstream = (GMimeStreamMmap *) stream; + gint64 real = stream->position; + + if (mstream->fd == -1) { + errno = EBADF; + return -1; + } + + switch (whence) { + case GMIME_STREAM_SEEK_SET: + real = offset; + break; + case GMIME_STREAM_SEEK_CUR: + real = stream->position + offset; + break; + case GMIME_STREAM_SEEK_END: + if (stream->bound_end == -1) { + real = offset <= 0 ? stream->bound_start + (gint64) mstream->maplen + offset : -1; + if (real != -1) { + if (real < stream->bound_start) + real = stream->bound_start; + stream->position = real; + } + + return real; + } + real = stream->bound_end + offset; + break; + } + + /* sanity check the resultant offset */ + if (real < stream->bound_start) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1 && real > stream->bound_end) { + errno = EINVAL; + return -1; + } + + /* reset eos if appropriate */ + if ((stream->bound_end != -1 && real < stream->bound_end) || + (mstream->eos && real < stream->position)) + mstream->eos = FALSE; + + stream->position = real; + + return real; +} + +static gint64 +stream_tell (GMimeStream *stream) +{ + GMimeStreamMmap *mstream = (GMimeStreamMmap *) stream; + + if (mstream->fd == -1) { + errno = EBADF; + return -1; + } + + return stream->position; +} + +static gint64 +stream_length (GMimeStream *stream) +{ + GMimeStreamMmap *mstream = (GMimeStreamMmap *) stream; + + if (mstream->fd == -1) { + errno = EBADF; + return -1; + } + + if (stream->bound_start != -1 && stream->bound_end != -1) + return stream->bound_end - stream->bound_start; + + return mstream->maplen - stream->bound_start; +} + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + /* FIXME: maybe we should return a GMimeStreamFs? */ + GMimeStreamMmap *mstream; + + mstream = g_object_newv (GMIME_TYPE_STREAM_MMAP, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (mstream), start, end); + mstream->fd = GMIME_STREAM_MMAP (stream)->fd; + mstream->owner = FALSE; + + mstream->maplen = GMIME_STREAM_MMAP (stream)->maplen; + mstream->map = GMIME_STREAM_MMAP (stream)->map; + + return (GMimeStream *) mstream; +} + + +/** + * g_mime_stream_mmap_new: + * @fd: file descriptor + * @prot: protection flags + * @flags: map flags + * + * Creates a new #GMimeStreamMmap object around @fd. + * + * Returns: a stream using @fd. + **/ +GMimeStream * +g_mime_stream_mmap_new (int fd, int prot, int flags) +{ +#ifdef HAVE_MMAP + GMimeStreamMmap *mstream; + struct stat st; + gint64 start; + char *map; + + if ((start = lseek (fd, 0, SEEK_CUR)) == -1) + return NULL; + + if (fstat (fd, &st) == -1) + return NULL; + + map = mmap (NULL, st.st_size, prot, flags, fd, 0); + if (map == MAP_FAILED) + return NULL; + + mstream = g_object_newv (GMIME_TYPE_STREAM_MMAP, 0, NULL); + g_mime_stream_construct ((GMimeStream *) mstream, start, -1); + mstream->owner = TRUE; + mstream->eos = FALSE; + mstream->fd = fd; + mstream->map = map; + mstream->maplen = st.st_size; + + return (GMimeStream *) mstream; +#else + return NULL; +#endif /* HAVE_MMAP */ +} + + +/** + * g_mime_stream_mmap_new_with_bounds: + * @fd: file descriptor + * @prot: protection flags + * @flags: map flags + * @start: start boundary + * @end: end boundary + * + * Creates a new #GMimeStreamMmap object around @fd with bounds @start + * and @end. + * + * Returns: a stream using @fd with bounds @start and @end. + **/ +GMimeStream * +g_mime_stream_mmap_new_with_bounds (int fd, int prot, int flags, gint64 start, gint64 end) +{ +#ifdef HAVE_MMAP + GMimeStreamMmap *mstream; + struct stat st; + size_t len; + char *map; + + if (end == -1) { + if (fstat (fd, &st) == -1) + return NULL; + + len = st.st_size; + } else + len = (size_t) end; + + if ((map = mmap (NULL, len, prot, flags, fd, 0)) == MAP_FAILED) + return NULL; + + mstream = g_object_newv (GMIME_TYPE_STREAM_MMAP, 0, NULL); + g_mime_stream_construct ((GMimeStream *) mstream, start, end); + mstream->owner = TRUE; + mstream->eos = FALSE; + mstream->fd = fd; + mstream->map = map; + mstream->maplen = len; + + return (GMimeStream *) mstream; +#else + return NULL; +#endif /* HAVE_MMAP */ +} diff --git a/gmime/gmime-stream-mmap.h b/gmime/gmime-stream-mmap.h new file mode 100644 index 0000000..62f8a4d --- /dev/null +++ b/gmime/gmime-stream-mmap.h @@ -0,0 +1,74 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_MMAP_H__ +#define __GMIME_STREAM_MMAP_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM_MMAP (g_mime_stream_mmap_get_type ()) +#define GMIME_STREAM_MMAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM_MMAP, GMimeStreamMmap)) +#define GMIME_STREAM_MMAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM_MMAP, GMimeStreamMmapClass)) +#define GMIME_IS_STREAM_MMAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM_MMAP)) +#define GMIME_IS_STREAM_MMAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM_MMAP)) +#define GMIME_STREAM_MMAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM_MMAP, GMimeStreamMmapClass)) + +typedef struct _GMimeStreamMmap GMimeStreamMmap; +typedef struct _GMimeStreamMmapClass GMimeStreamMmapClass; + +/** + * GMimeStreamMmap: + * @parent_object: parent #GMimeStream + * @owner: %TRUE if this stream owns the memory map + * @eos: %TRUE if end-of-stream + * @fd: file descriptor + * @map: memory map + * @maplen: length of the memory map + * + * A memory-mapped #GMimeStream. + **/ +struct _GMimeStreamMmap { + GMimeStream parent_object; + + gboolean owner; + gboolean eos; + int fd; + + char *map; + size_t maplen; +}; + +struct _GMimeStreamMmapClass { + GMimeStreamClass parent_class; + +}; + + +GType g_mime_stream_mmap_get_type (void); + +GMimeStream *g_mime_stream_mmap_new (int fd, int prot, int flags); +GMimeStream *g_mime_stream_mmap_new_with_bounds (int fd, int prot, int flags, gint64 start, gint64 end); + +G_END_DECLS + +#endif /* __GMIME_STREAM_MMAP_H__ */ diff --git a/gmime/gmime-stream-null.c b/gmime/gmime-stream-null.c new file mode 100644 index 0000000..10ba412 --- /dev/null +++ b/gmime/gmime-stream-null.c @@ -0,0 +1,254 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-stream-null.h" + + +/** + * SECTION: gmime-stream-null + * @title: GMimeStreamNull + * @short_description: A null stream + * @see_also: #GMimeStream + * + * A #GMimeStream which has no real backing storage at all. This + * stream is useful for dry-runs and can also be useful for + * determining statistics on source data which can be written to + * streams but cannot be read as a stream itself (e.g. a #GMimeObject + * via g_mime_object_write_to_stream()). + **/ + + +static void g_mime_stream_null_class_init (GMimeStreamNullClass *klass); +static void g_mime_stream_null_init (GMimeStreamNull *stream, GMimeStreamNullClass *klass); +static void g_mime_stream_null_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GMimeStreamClass *parent_class = NULL; + + +GType +g_mime_stream_null_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamNullClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_null_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStreamNull), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_null_init, + }; + + type = g_type_register_static (GMIME_TYPE_STREAM, "GMimeStreamNull", &info, 0); + } + + return type; +} + + +static void +g_mime_stream_null_class_init (GMimeStreamNullClass *klass) +{ + GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_STREAM); + + object_class->finalize = g_mime_stream_null_finalize; + + stream_class->read = stream_read; + stream_class->write = stream_write; + stream_class->flush = stream_flush; + stream_class->close = stream_close; + stream_class->eos = stream_eos; + stream_class->reset = stream_reset; + stream_class->seek = stream_seek; + stream_class->tell = stream_tell; + stream_class->length = stream_length; + stream_class->substream = stream_substream; +} + +static void +g_mime_stream_null_init (GMimeStreamNull *stream, GMimeStreamNullClass *klass) +{ + stream->written = 0; + stream->newlines = 0; +} + +static void +g_mime_stream_null_finalize (GObject *object) +{ + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t len) +{ + memset (buf, 0, len); + + stream->position += len; + + return len; +} + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + GMimeStreamNull *null = (GMimeStreamNull *) stream; + register const char *inptr = buf; + const char *inend = buf + len; + + while (inptr < inend) { + if (*inptr == '\n') + null->newlines++; + inptr++; + } + + null->written += len; + stream->position += len; + + return len; +} + +static int +stream_flush (GMimeStream *stream) +{ + return 0; +} + +static int +stream_close (GMimeStream *stream) +{ + return 0; +} + +static gboolean +stream_eos (GMimeStream *stream) +{ + return TRUE; +} + +static int +stream_reset (GMimeStream *stream) +{ + GMimeStreamNull *null = (GMimeStreamNull *) stream; + + null->written = 0; + null->newlines = 0; + + return 0; +} + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + GMimeStreamNull *null = (GMimeStreamNull *) stream; + gint64 bound_end; + + bound_end = stream->bound_end != -1 ? stream->bound_end : null->written; + + switch (whence) { + case GMIME_STREAM_SEEK_SET: + stream->position = MIN (offset + stream->bound_start, bound_end); + break; + case GMIME_STREAM_SEEK_END: + stream->position = MAX (offset + bound_end, 0); + break; + case GMIME_STREAM_SEEK_CUR: + stream->position += offset; + if (stream->position < stream->bound_start) + stream->position = stream->bound_start; + else if (stream->position > bound_end) + stream->position = bound_end; + } + + return stream->position; +} + +static gint64 +stream_tell (GMimeStream *stream) +{ + return stream->position; +} + +static gint64 +stream_length (GMimeStream *stream) +{ + GMimeStreamNull *null = (GMimeStreamNull *) stream; + gint64 bound_end; + + bound_end = stream->bound_end != -1 ? stream->bound_end : null->written; + + return bound_end - stream->bound_start; +} + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + GMimeStream *null; + + null = g_object_newv (GMIME_TYPE_STREAM_NULL, 0, NULL); + g_mime_stream_construct (null, start, end); + + return null; +} + + +/** + * g_mime_stream_null_new: + * + * Creates a new #GMimeStreamNull object. + * + * Returns: a new null stream (similar to /dev/null on Unix). + **/ +GMimeStream * +g_mime_stream_null_new (void) +{ + GMimeStream *null; + + null = g_object_newv (GMIME_TYPE_STREAM_NULL, 0, NULL); + g_mime_stream_construct (null, 0, -1); + + return null; +} diff --git a/gmime/gmime-stream-null.h b/gmime/gmime-stream-null.h new file mode 100644 index 0000000..a3a232b --- /dev/null +++ b/gmime/gmime-stream-null.h @@ -0,0 +1,67 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_NULL_H__ +#define __GMIME_STREAM_NULL_H__ + +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM_NULL (g_mime_stream_null_get_type ()) +#define GMIME_STREAM_NULL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM_NULL, GMimeStreamNull)) +#define GMIME_STREAM_NULL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM_NULL, GMimeStreamNullClass)) +#define GMIME_IS_STREAM_NULL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM_NULL)) +#define GMIME_IS_STREAM_NULL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM_NULL)) +#define GMIME_STREAM_NULL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM_NULL, GMimeStreamNullClass)) + +typedef struct _GMimeStreamNull GMimeStreamNull; +typedef struct _GMimeStreamNullClass GMimeStreamNullClass; + +/** + * GMimeStreamNull: + * @parent_object: parent #GMimeStream + * @written: number of bytes written to this stream + * @newlines: the number of newlines written to this stream + * + * A #GMimeStream which has no backing store. + **/ +struct _GMimeStreamNull { + GMimeStream parent_object; + + size_t written; + size_t newlines; +}; + +struct _GMimeStreamNullClass { + GMimeStreamClass parent_class; + +}; + + +GType g_mime_stream_null_get_type (void); + +GMimeStream *g_mime_stream_null_new (void); + +G_END_DECLS + +#endif /* __GMIME_STREAM_NULL_H__ */ diff --git a/gmime/gmime-stream-pipe.c b/gmime/gmime-stream-pipe.c new file mode 100644 index 0000000..1d063bd --- /dev/null +++ b/gmime/gmime-stream-pipe.c @@ -0,0 +1,343 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include +#include + +#include "gmime-stream-pipe.h" + + +/** + * SECTION: gmime-stream-pipe + * @title: GMimeStreamPipe + * @short_description: A low-level pipe stream + * @see_also: #GMimeStream + * + * A simple #GMimeStream implementation that sits on top of low-level + * POSIX pipes. + **/ + + +static void g_mime_stream_pipe_class_init (GMimeStreamPipeClass *klass); +static void g_mime_stream_pipe_init (GMimeStreamPipe *stream, GMimeStreamPipeClass *klass); +static void g_mime_stream_pipe_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GMimeStreamClass *parent_class = NULL; + + +GType +g_mime_stream_pipe_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamPipeClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_pipe_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStreamPipe), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_pipe_init, + }; + + type = g_type_register_static (GMIME_TYPE_STREAM, "GMimeStreamPipe", &info, 0); + } + + return type; +} + + +static void +g_mime_stream_pipe_class_init (GMimeStreamPipeClass *klass) +{ + GMimeStreamClass *stream_class = GMIME_STREAM_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (GMIME_TYPE_STREAM); + + object_class->finalize = g_mime_stream_pipe_finalize; + + stream_class->read = stream_read; + stream_class->write = stream_write; + stream_class->flush = stream_flush; + stream_class->close = stream_close; + stream_class->eos = stream_eos; + stream_class->reset = stream_reset; + stream_class->seek = stream_seek; + stream_class->tell = stream_tell; + stream_class->length = stream_length; + stream_class->substream = stream_substream; +} + +static void +g_mime_stream_pipe_init (GMimeStreamPipe *stream, GMimeStreamPipeClass *klass) +{ + stream->owner = TRUE; + stream->eos = FALSE; + stream->fd = -1; +} + +static void +g_mime_stream_pipe_finalize (GObject *object) +{ + GMimeStreamPipe *stream = (GMimeStreamPipe *) object; + + if (stream->owner && stream->fd != -1) + close (stream->fd); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t len) +{ + GMimeStreamPipe *pipes = (GMimeStreamPipe *) stream; + ssize_t nread; + + if (pipes->fd == -1) { + errno = EBADF; + return -1; + } + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1) + len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); + + do { + nread = read (pipes->fd, buf, len); + } while (nread == -1 && errno == EINTR); + + if (nread > 0) { + stream->position += nread; + } else if (nread == 0) { + pipes->eos = TRUE; + } + + return nread; +} + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + GMimeStreamPipe *pipes = (GMimeStreamPipe *) stream; + size_t nwritten = 0; + ssize_t n; + + if (pipes->fd == -1) { + errno = EBADF; + return -1; + } + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) { + errno = EINVAL; + return -1; + } + + if (stream->bound_end != -1) + len = (size_t) MIN (stream->bound_end - stream->position, (gint64) len); + + do { + do { + n = write (pipes->fd, buf + nwritten, len - nwritten); + } while (n == -1 && (errno == EINTR || errno == EAGAIN)); + + if (n > 0) + nwritten += n; + } while (n != -1 && nwritten < len); + + if (n == -1 && (errno == EFBIG || errno == ENOSPC)) + pipes->eos = TRUE; + + if (nwritten > 0) { + stream->position += nwritten; + } else if (n == -1) { + /* error and nothing written */ + return -1; + } + + return nwritten; +} + +static int +stream_flush (GMimeStream *stream) +{ + GMimeStreamPipe *pipes = (GMimeStreamPipe *) stream; + + if (pipes->fd == -1) { + errno = EBADF; + return -1; + } + + return 0; +} + +static int +stream_close (GMimeStream *stream) +{ + GMimeStreamPipe *pipes = (GMimeStreamPipe *) stream; + int rv; + + if (pipes->fd == -1) + return 0; + + do { + if ((rv = close (pipes->fd)) == 0) + pipes->fd = -1; + } while (rv == -1 && errno == EINTR); + + return rv; +} + +static gboolean +stream_eos (GMimeStream *stream) +{ + GMimeStreamPipe *pipes = (GMimeStreamPipe *) stream; + + if (pipes->fd == -1) + return TRUE; + + return pipes->eos; +} + +static int +stream_reset (GMimeStream *stream) +{ + GMimeStreamPipe *pipes = (GMimeStreamPipe *) stream; + + if (pipes->fd == -1) { + errno = EBADF; + return -1; + } + + return 0; +} + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + return -1; +} + +static gint64 +stream_tell (GMimeStream *stream) +{ + return -1; +} + +static gint64 +stream_length (GMimeStream *stream) +{ + return -1; +} + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + return NULL; +} + + +/** + * g_mime_stream_pipe_new: + * @fd: a pipe descriptor + * + * Creates a new #GMimeStreamPipe object around @fd. + * + * Returns: a stream using @fd. + **/ +GMimeStream * +g_mime_stream_pipe_new (int fd) +{ + GMimeStreamPipe *pipes; + + pipes = g_object_newv (GMIME_TYPE_STREAM_PIPE, 0, NULL); + g_mime_stream_construct (GMIME_STREAM (pipes), 0, -1); + pipes->owner = TRUE; + pipes->eos = FALSE; + pipes->fd = fd; + + return (GMimeStream *) pipes; +} + + +/** + * g_mime_stream_pipe_get_owner: + * @stream: a #GMimeStreamPipe + * + * Gets whether or not @stream owns the backend pipe descriptor. + * + * Returns: %TRUE if @stream owns the backend pipe descriptor or %FALSE + * otherwise. + **/ +gboolean +g_mime_stream_pipe_get_owner (GMimeStreamPipe *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM_PIPE (stream), FALSE); + + return stream->owner; +} + + +/** + * g_mime_stream_pipe_set_owner: + * @stream: a #GMimeStreamPipe + * @owner: owner + * + * Sets whether or not @stream owns the backend pipe descriptor. + * + * Note: @owner should be %TRUE if the stream should close() the + * backend pipe descriptor when destroyed or %FALSE otherwise. + **/ +void +g_mime_stream_pipe_set_owner (GMimeStreamPipe *stream, gboolean owner) +{ + g_return_if_fail (GMIME_IS_STREAM_PIPE (stream)); + + stream->owner = owner; +} diff --git a/gmime/gmime-stream-pipe.h b/gmime/gmime-stream-pipe.h new file mode 100644 index 0000000..e662876 --- /dev/null +++ b/gmime/gmime-stream-pipe.h @@ -0,0 +1,71 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_PIPE_H__ +#define __GMIME_STREAM_PIPE_H__ + +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM_PIPE (g_mime_stream_pipe_get_type ()) +#define GMIME_STREAM_PIPE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM_PIPE, GMimeStreamPipe)) +#define GMIME_STREAM_PIPE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM_PIPE, GMimeStreamPipeClass)) +#define GMIME_IS_STREAM_PIPE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM_PIPE)) +#define GMIME_IS_STREAM_PIPE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM_PIPE)) +#define GMIME_STREAM_PIPE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM_PIPE, GMimeStreamPipeClass)) + +typedef struct _GMimeStreamPipe GMimeStreamPipe; +typedef struct _GMimeStreamPipeClass GMimeStreamPipeClass; + +/** + * GMimeStreamPipe: + * @parent_object: parent #GMimeStream + * @owner: %TRUE if this stream owns @fd + * @eos: %TRUE if end-of-stream + * @fd: pipe descriptor + * + * A #GMimeStream wrapper around pipes. + **/ +struct _GMimeStreamPipe { + GMimeStream parent_object; + + gboolean owner; + gboolean eos; + int fd; +}; + +struct _GMimeStreamPipeClass { + GMimeStreamClass parent_class; + +}; + + +GType g_mime_stream_pipe_get_type (void); + +GMimeStream *g_mime_stream_pipe_new (int fd); + +gboolean g_mime_stream_pipe_get_owner (GMimeStreamPipe *stream); +void g_mime_stream_pipe_set_owner (GMimeStreamPipe *stream, gboolean owner); + +G_END_DECLS + +#endif /* __GMIME_STREAM_PIPE_H__ */ diff --git a/gmime/gmime-stream.c b/gmime/gmime-stream.c new file mode 100644 index 0000000..60f2ba6 --- /dev/null +++ b/gmime/gmime-stream.c @@ -0,0 +1,606 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include "gmime-stream.h" + +#define d(x) + + +/** + * SECTION: gmime-stream + * @title: GMimeStream + * @short_description: Abstract stream class + * @see_also: + * + * Streams are the fundamental method for reading and writing data + * used by GMime. You'll probably notice that the basic API is similar + * to that of the low-level Unix I/O layer (read(), write(), lseek(), + * etc) with some additional nicities such as a printf-like function. + **/ + + +static void g_mime_stream_class_init (GMimeStreamClass *klass); +static void g_mime_stream_init (GMimeStream *stream, GMimeStreamClass *klass); +static void g_mime_stream_finalize (GObject *object); + +static ssize_t stream_read (GMimeStream *stream, char *buf, size_t len); +static ssize_t stream_write (GMimeStream *stream, const char *buf, size_t len); +static int stream_flush (GMimeStream *stream); +static int stream_close (GMimeStream *stream); +static gboolean stream_eos (GMimeStream *stream); +static int stream_reset (GMimeStream *stream); +static gint64 stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +static gint64 stream_tell (GMimeStream *stream); +static gint64 stream_length (GMimeStream *stream); +static GMimeStream *stream_substream (GMimeStream *stream, gint64 start, gint64 end); + + +static GObjectClass *parent_class = NULL; + + +GType +g_mime_stream_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (GMimeStreamClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) g_mime_stream_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GMimeStream), + 0, /* n_preallocs */ + (GInstanceInitFunc) g_mime_stream_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "GMimeStream", + &info, G_TYPE_FLAG_ABSTRACT); + } + + return type; +} + + +static void +g_mime_stream_class_init (GMimeStreamClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = g_mime_stream_finalize; + + klass->read = stream_read; + klass->write = stream_write; + klass->flush = stream_flush; + klass->close = stream_close; + klass->eos = stream_eos; + klass->reset = stream_reset; + klass->seek = stream_seek; + klass->tell = stream_tell; + klass->length = stream_length; + klass->substream = stream_substream; +} + +static void +g_mime_stream_init (GMimeStream *stream, GMimeStreamClass *klass) +{ + stream->super_stream = NULL; + + stream->position = 0; + stream->bound_start = 0; + stream->bound_end = 0; +} + +static void +g_mime_stream_finalize (GObject *object) +{ + GMimeStream *stream = (GMimeStream *) object; + + if (stream->super_stream) + g_object_unref (stream->super_stream); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +/** + * g_mime_stream_construct: + * @stream: a #GMimeStream + * @start: start boundary + * @end: end boundary + * + * Initializes a new stream with bounds @start and @end. + **/ +void +g_mime_stream_construct (GMimeStream *stream, gint64 start, gint64 end) +{ + stream->position = start; + stream->bound_start = start; + stream->bound_end = end; +} + + +static ssize_t +stream_read (GMimeStream *stream, char *buf, size_t len) +{ + d(g_warning ("Invoked default stream_read implementation.")); + return 0; +} + + +/** + * g_mime_stream_read: + * @stream: a #GMimeStream + * @buf: buffer + * @len: buffer length + * + * Attempts to read up to @len bytes from @stream into @buf. + * + * Returns: the number of bytes read or %-1 on fail. + **/ +ssize_t +g_mime_stream_read (GMimeStream *stream, char *buf, size_t len) +{ + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + g_return_val_if_fail (buf != NULL, -1); + + if (len == 0) + return 0; + + return GMIME_STREAM_GET_CLASS (stream)->read (stream, buf, len); +} + + +static ssize_t +stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + d(g_warning ("Invoked default stream_write implementation.")); + return 0; +} + + +/** + * g_mime_stream_write: + * @stream: a #GMimeStream + * @buf: buffer + * @len: buffer length + * + * Attempts to write up to @len bytes of @buf to @stream. + * + * Returns: the number of bytes written or %-1 on fail. + **/ +ssize_t +g_mime_stream_write (GMimeStream *stream, const char *buf, size_t len) +{ + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + g_return_val_if_fail (buf != NULL, -1); + + if (len == 0) + return 0; + + return GMIME_STREAM_GET_CLASS (stream)->write (stream, buf, len); +} + + +static int +stream_flush (GMimeStream *stream) +{ + d(g_warning ("Invoked default stream_flush implementation.")); + return 0; +} + + +/** + * g_mime_stream_flush: + * @stream: a #GMimeStream + * + * Sync's the stream to disk. + * + * Returns: %0 on success or %-1 on fail. + **/ +int +g_mime_stream_flush (GMimeStream *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + + return GMIME_STREAM_GET_CLASS (stream)->flush (stream); +} + + +static int +stream_close (GMimeStream *stream) +{ + d(g_warning ("Invoked default stream_close implementation.")); + return 0; +} + + +/** + * g_mime_stream_close: + * @stream: a #GMimeStream + * + * Closes the stream. + * + * Returns: %0 on success or %-1 on fail. + **/ +int +g_mime_stream_close (GMimeStream *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + + return GMIME_STREAM_GET_CLASS (stream)->close (stream); +} + + +static gboolean +stream_eos (GMimeStream *stream) +{ + d(g_warning ("Invoked default stream_eos implementation.")); + return stream->position >= stream->bound_end; +} + + +/** + * g_mime_stream_eos: + * @stream: a #GMimeStream + * + * Tests the end-of-stream indicator for @stream. + * + * Returns: %TRUE on EOS or %FALSE otherwise. + **/ +gboolean +g_mime_stream_eos (GMimeStream *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM (stream), TRUE); + + if (stream->bound_end != -1 && stream->position >= stream->bound_end) + return TRUE; + + return GMIME_STREAM_GET_CLASS (stream)->eos (stream); +} + + +static int +stream_reset (GMimeStream *stream) +{ + d(g_warning ("Invoked default stream_reset implementation.")); + return 0; +} + + +/** + * g_mime_stream_reset: + * @stream: a #GMimeStream + * + * Resets the stream. + * + * Returns: %0 on success or %-1 on fail. + **/ +int +g_mime_stream_reset (GMimeStream *stream) +{ + int rv; + + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + + if ((rv = GMIME_STREAM_GET_CLASS (stream)->reset (stream)) == 0) + stream->position = stream->bound_start; + + return rv; +} + + +static gint64 +stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + d(g_warning ("Invoked default stream_seek implementation.")); + return -1; +} + + +/** + * g_mime_stream_seek: + * @stream: a #GMimeStream + * @offset: positional offset + * @whence: seek directive + * + * Repositions the offset of the stream @stream to + * the argument @offset according to the + * directive @whence as follows: + * + * #GMIME_STREAM_SEEK_SET: Seek @offset bytes relative to + * the beginning (bound_start) of the stream. + * + * #GMIME_STREAM_SEEK_CUR: Seek @offset bytes relative to the + * current offset of the stream. + * + * #GMIME_STREAM_SEEK_END: Seek @offset bytes relative to the + * end of the stream (bound_end if non-negative). + * + * Returns: the resultant position on success or %-1 on fail. + **/ +gint64 +g_mime_stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence) +{ + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + + return GMIME_STREAM_GET_CLASS (stream)->seek (stream, offset, whence); +} + + +static gint64 +stream_tell (GMimeStream *stream) +{ + d(g_warning ("Invoked default stream_tell implementation.")); + return stream->position; +} + + +/** + * g_mime_stream_tell: + * @stream: a #GMimeStream + * + * Gets the current offset within the stream. + * + * Returns: the current position within the stream or %-1 on fail. + **/ +gint64 +g_mime_stream_tell (GMimeStream *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + + return GMIME_STREAM_GET_CLASS (stream)->tell (stream); +} + + +static gint64 +stream_length (GMimeStream *stream) +{ + gint64 position = stream->position; + gint64 bound_end; + + if (stream->bound_end != -1) + return stream->bound_end - stream->bound_start; + + bound_end = g_mime_stream_seek (stream, 0, GMIME_STREAM_SEEK_END); + g_mime_stream_seek (stream, position, GMIME_STREAM_SEEK_SET); + + if (bound_end < stream->bound_start) + return -1; + + return bound_end - stream->bound_start; +} + + +/** + * g_mime_stream_length: + * @stream: a #GMimeStream + * + * Gets the length of the stream. + * + * Returns: the length of the stream or %-1 if unknown. + **/ +gint64 +g_mime_stream_length (GMimeStream *stream) +{ + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + + return GMIME_STREAM_GET_CLASS (stream)->length (stream); +} + + +static GMimeStream * +stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + d(g_warning ("Invoked default stream_tell implementation.")); + return NULL; +} + + +/** + * g_mime_stream_substream: + * @stream: a #GMimeStream + * @start: start boundary + * @end: end boundary + * + * Creates a new substream of @stream with bounds @start and @end. + * + * Returns: a substream of @stream with bounds @start and @end. + **/ +GMimeStream * +g_mime_stream_substream (GMimeStream *stream, gint64 start, gint64 end) +{ + GMimeStream *sub; + + g_return_val_if_fail (GMIME_IS_STREAM (stream), NULL); + + if ((sub = GMIME_STREAM_GET_CLASS (stream)->substream (stream, start, end))) { + sub->super_stream = stream; + g_object_ref (stream); + } + + return sub; +} + + +/** + * g_mime_stream_set_bounds: + * @stream: a #GMimeStream + * @start: start boundary + * @end: end boundary + * + * Set the bounds on a stream. + **/ +void +g_mime_stream_set_bounds (GMimeStream *stream, gint64 start, gint64 end) +{ + g_return_if_fail (GMIME_IS_STREAM (stream)); + + stream->bound_start = start; + stream->bound_end = end; + + if (stream->position < start) + stream->position = start; + else if (stream->position > end && end != -1) + stream->position = end; +} + + +/** + * g_mime_stream_write_string: + * @stream: a #GMimeStream + * @str: string to write + * + * Writes @string to @stream. + * + * Returns: the number of bytes written or %-1 on fail. + **/ +ssize_t +g_mime_stream_write_string (GMimeStream *stream, const char *str) +{ + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + g_return_val_if_fail (str != NULL, -1); + + return g_mime_stream_write (stream, str, strlen (str)); +} + + +/** + * g_mime_stream_printf: + * @stream: a #GMimeStream + * @fmt: format + * @Varargs: arguments + * + * Write formatted output to a stream. + * + * Returns: the number of bytes written or %-1 on fail. + **/ +ssize_t +g_mime_stream_printf (GMimeStream *stream, const char *fmt, ...) +{ + va_list args; + char *string; + ssize_t ret; + + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + g_return_val_if_fail (fmt != NULL, -1); + + va_start (args, fmt); + string = g_strdup_vprintf (fmt, args); + va_end (args); + + if (!string) + return -1; + + ret = g_mime_stream_write (stream, string, strlen (string)); + g_free (string); + + return ret; +} + + +/** + * g_mime_stream_write_to_stream: + * @src: source stream + * @dest: destination stream + * + * Attempts to write the source stream to the destination stream. + * + * Returns: the number of bytes written or %-1 on fail. + **/ +ssize_t +g_mime_stream_write_to_stream (GMimeStream *src, GMimeStream *dest) +{ + ssize_t nread, nwritten, total = 0; + char buf[4096]; + + g_return_val_if_fail (GMIME_IS_STREAM (src), -1); + g_return_val_if_fail (GMIME_IS_STREAM (dest), -1); + + while (!g_mime_stream_eos (src)) { + if ((nread = g_mime_stream_read (src, buf, sizeof (buf))) < 0) + return -1; + + if (nread > 0) { + nwritten = 0; + while (nwritten < nread) { + ssize_t len; + + if ((len = g_mime_stream_write (dest, buf + nwritten, nread - nwritten)) < 0) + return -1; + + nwritten += len; + } + + total += nwritten; + } + } + + return total; +} + + +/** + * g_mime_stream_writev: + * @stream: a #GMimeStream + * @vector: a #GMimeStreamIOVector + * @count: number of vector elements + * + * Writes at most @count blocks described by @vector to @stream. + * + * Returns: the number of bytes written or %-1 on fail. + **/ +ssize_t +g_mime_stream_writev (GMimeStream *stream, GMimeStreamIOVector *vector, size_t count) +{ + ssize_t total = 0; + size_t i; + + g_return_val_if_fail (GMIME_IS_STREAM (stream), -1); + + for (i = 0; i < count; i++) { + char *buffer = vector[i].data; + size_t nwritten = 0; + ssize_t n; + + while (nwritten < vector[i].len) { + if ((n = g_mime_stream_write (stream, buffer + nwritten, + vector[i].len - nwritten)) < 0) + return -1; + + nwritten += n; + } + + total += nwritten; + } + + return total; +} diff --git a/gmime/gmime-stream.h b/gmime/gmime-stream.h new file mode 100644 index 0000000..d41ca1b --- /dev/null +++ b/gmime/gmime-stream.h @@ -0,0 +1,139 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_STREAM_H__ +#define __GMIME_STREAM_H__ + +#include +#include + +#include +#include +#include + +G_BEGIN_DECLS + +#define GMIME_TYPE_STREAM (g_mime_stream_get_type ()) +#define GMIME_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GMIME_TYPE_STREAM, GMimeStream)) +#define GMIME_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GMIME_TYPE_STREAM, GMimeStreamClass)) +#define GMIME_IS_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GMIME_TYPE_STREAM)) +#define GMIME_IS_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GMIME_TYPE_STREAM)) +#define GMIME_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GMIME_TYPE_STREAM, GMimeStreamClass)) + +typedef struct _GMimeStream GMimeStream; +typedef struct _GMimeStreamClass GMimeStreamClass; + + +/** + * GMimeSeekWhence: + * @GMIME_STREAM_SEEK_SET: Seek relative to the beginning of the stream. + * @GMIME_STREAM_SEEK_CUR: Seek relative to the current position in the stream. + * @GMIME_STREAM_SEEK_END: Seek relative to the end of the stream. + * + * Relative seek position. + **/ +typedef enum { + GMIME_STREAM_SEEK_SET = SEEK_SET, + GMIME_STREAM_SEEK_CUR = SEEK_CUR, + GMIME_STREAM_SEEK_END = SEEK_END +} GMimeSeekWhence; + + +/** + * GMimeStreamIOVector: + * @data: data to pass to the I/O function. + * @len: length of the data, in bytes. + * + * An I/O vector for use with g_mime_stream_writev(). + **/ +typedef struct { + void *data; + size_t len; +} GMimeStreamIOVector; + + +/** + * GMimeStream: + * @parent_object: parent #GObject + * @super_stream: parent stream if this is a substream + * @position: the current stream position + * @bound_start: start boundary of the stream + * @bound_end: end boundary of the stream + * + * Abstract I/O stream class. + **/ +struct _GMimeStream { + GObject parent_object; + + /* */ + GMimeStream *super_stream; + + gint64 position; + gint64 bound_start; + gint64 bound_end; +}; + +struct _GMimeStreamClass { + GObjectClass parent_class; + + ssize_t (* read) (GMimeStream *stream, char *buf, size_t len); + ssize_t (* write) (GMimeStream *stream, const char *buf, size_t len); + int (* flush) (GMimeStream *stream); + int (* close) (GMimeStream *stream); + gboolean (* eos) (GMimeStream *stream); + int (* reset) (GMimeStream *stream); + gint64 (* seek) (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); + gint64 (* tell) (GMimeStream *stream); + gint64 (* length) (GMimeStream *stream); + GMimeStream * (* substream) (GMimeStream *stream, gint64 start, gint64 end); +}; + + +GType g_mime_stream_get_type (void); + +void g_mime_stream_construct (GMimeStream *stream, gint64 start, gint64 end); + + +/* public methods */ +ssize_t g_mime_stream_read (GMimeStream *stream, char *buf, size_t len); +ssize_t g_mime_stream_write (GMimeStream *stream, const char *buf, size_t len); +int g_mime_stream_flush (GMimeStream *stream); +int g_mime_stream_close (GMimeStream *stream); +gboolean g_mime_stream_eos (GMimeStream *stream); +int g_mime_stream_reset (GMimeStream *stream); +gint64 g_mime_stream_seek (GMimeStream *stream, gint64 offset, GMimeSeekWhence whence); +gint64 g_mime_stream_tell (GMimeStream *stream); +gint64 g_mime_stream_length (GMimeStream *stream); + +GMimeStream *g_mime_stream_substream (GMimeStream *stream, gint64 start, gint64 end); + +void g_mime_stream_set_bounds (GMimeStream *stream, gint64 start, gint64 end); + +ssize_t g_mime_stream_write_string (GMimeStream *stream, const char *str); +ssize_t g_mime_stream_printf (GMimeStream *stream, const char *fmt, ...) G_GNUC_PRINTF (2, 3); + +ssize_t g_mime_stream_write_to_stream (GMimeStream *src, GMimeStream *dest); + +ssize_t g_mime_stream_writev (GMimeStream *stream, GMimeStreamIOVector *vector, size_t count); + +G_END_DECLS + +#endif /* __GMIME_STREAM_H__ */ diff --git a/gmime/gmime-table-private.h b/gmime/gmime-table-private.h new file mode 100644 index 0000000..6e613aa --- /dev/null +++ b/gmime/gmime-table-private.h @@ -0,0 +1,71 @@ +/* THIS FILE IS AUTOGENERATED: DO NOT EDIT! */ + +/** + * To regenerate: + * make gen-table + * ./gen-table > gmime-table-private.h + **/ + +static unsigned short gmime_special_table[256] = { + 1029,1029,1029,1029,1029,1029,1029,1029,1029,3175,1031,1029,1029,1063,1029,1029, + 1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029,1029, + 3314,1984,1100,1728,1728,1216,1728,1216,1100,1100,1472,1984,1100,1984,1608,1348, + 1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1100,1100,1100,1284,1100,1092, + 1100,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984, + 1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1132,1260,1132,1728,1856, + 1728,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984, + 1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1984,1728,1728,1728,1728,1029, + 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 +}; + +enum { + IS_CTRL = (1 << 0), + IS_LWSP = (1 << 1), + IS_TSPECIAL = (1 << 2), + IS_SPECIAL = (1 << 3), + IS_SPACE = (1 << 4), + IS_DSPECIAL = (1 << 5), + IS_QPSAFE = (1 << 6), + IS_ESAFE = (1 << 7), /* encoded word safe */ + IS_PSAFE = (1 << 8), /* encode word in phrase safe */ + IS_ATTRCHAR = (1 << 9), /* attribute-char from rfc2184 */ + + /* ctype replacements */ + IS_ASCII = (1 << 10), /* ascii */ + IS_BLANK = (1 << 11), /* space or tab */ +}; + +#define is_ctrl(x) ((gmime_special_table[(unsigned char)(x)] & IS_CTRL) != 0) +#define is_lwsp(x) ((gmime_special_table[(unsigned char)(x)] & IS_LWSP) != 0) +#define is_tspecial(x) ((gmime_special_table[(unsigned char)(x)] & IS_TSPECIAL) != 0) +#define is_type(x, t) ((gmime_special_table[(unsigned char)(x)] & (t)) != 0) +#define is_ttoken(x) ((gmime_special_table[(unsigned char)(x)] & (IS_TSPECIAL|IS_LWSP|IS_CTRL)) == 0) +#define is_atom(x) ((gmime_special_table[(unsigned char)(x)] & (IS_SPECIAL|IS_SPACE|IS_CTRL)) == 0) +#define is_dtext(x) ((gmime_special_table[(unsigned char)(x)] & IS_DSPECIAL) == 0) +#define is_fieldname(x) ((gmime_special_table[(unsigned char)(x)] & (IS_CTRL|IS_SPACE)) == 0) +#define is_qpsafe(x) ((gmime_special_table[(unsigned char)(x)] & IS_QPSAFE) != 0) +#define is_especial(x) ((gmime_special_table[(unsigned char)(x)] & IS_ESAFE) != 0) +#define is_psafe(x) ((gmime_special_table[(unsigned char)(x)] & IS_PSAFE) != 0) +#define is_attrchar(x) ((gmime_special_table[(unsigned char)(x)] & IS_ATTRCHAR) != 0) + +/* ctype replacements */ +#define is_ascii(x) ((gmime_special_table[(unsigned char)(x)] & IS_ASCII) != 0) +#define is_blank(x) ((gmime_special_table[(unsigned char)(x)] & IS_BLANK) != 0) + +#define CHARS_LWSP " \t\n\r" /* linear whitespace chars */ +#define CHARS_TSPECIAL "()<>@,;:\\\"/[]?=" +#define CHARS_SPECIAL "()<>@,;:\\\".[]" +#define CHARS_CSPECIAL "()\\\r" /* not in comments */ +#define CHARS_DSPECIAL "[]\\\r \t" /* not in domains */ +#define CHARS_ESPECIAL "()<>@,;:\"/[]?.=_" /* encoded word specials (rfc2047 5.1) */ +#define CHARS_PSPECIAL "!*+-/=_" /* encoded phrase specials (rfc2047 5.3) */ +#define CHARS_ATTRCHAR "*'% " /* attribute-char from rfc2184 */ + +#define GMIME_FOLD_LEN 76 diff --git a/gmime/gmime-utils.c b/gmime/gmime-utils.c new file mode 100644 index 0000000..afd2b22 --- /dev/null +++ b/gmime/gmime-utils.c @@ -0,0 +1,2845 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#define _GNU_SOURCE + +#include + +#include +#include +#include +#ifdef HAVE_SYS_PARAM_H +#include /* for MAXHOSTNAMELEN */ +#else +#define MAXHOSTNAMELEN 64 +#endif +#ifdef HAVE_UTSNAME_DOMAINNAME +#include /* for uname() */ +#endif +#include +#include /* Unix header for getpid() */ +#ifdef G_OS_WIN32 +#include +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#include +#include + +#include "gmime-utils.h" +#include "gmime-table-private.h" +#include "gmime-parse-utils.h" +#include "gmime-part.h" +#include "gmime-charset.h" +#include "gmime-iconv.h" +#include "gmime-iconv-utils.h" + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + +#define d(x) + + +/** + * SECTION: gmime-utils + * @title: gmime-utils + * @short_description: MIME utility functions + * @see_also: + * + * Utility functions to parse, encode and decode various MIME tokens + * and encodings. + **/ + +extern gboolean _g_mime_enable_rfc2047_workarounds (void); + +#define GMIME_FOLD_PREENCODED (GMIME_FOLD_LEN / 2) + +/* date parser macros */ +#define NUMERIC_CHARS "1234567890" +#define WEEKDAY_CHARS "SundayMondayTuesdayWednesdayThursdayFridaySaturday" +#define MONTH_CHARS "JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember" +#define TIMEZONE_ALPHA_CHARS "UTCGMTESTEDTCSTCDTMSTPSTPDTZAMNY()" +#define TIMEZONE_NUMERIC_CHARS "-+1234567890" +#define TIME_CHARS "1234567890:" + +#define DATE_TOKEN_NON_NUMERIC (1 << 0) +#define DATE_TOKEN_NON_WEEKDAY (1 << 1) +#define DATE_TOKEN_NON_MONTH (1 << 2) +#define DATE_TOKEN_NON_TIME (1 << 3) +#define DATE_TOKEN_HAS_COLON (1 << 4) +#define DATE_TOKEN_NON_TIMEZONE_ALPHA (1 << 5) +#define DATE_TOKEN_NON_TIMEZONE_NUMERIC (1 << 6) +#define DATE_TOKEN_HAS_SIGN (1 << 7) + +static unsigned char tohex[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' +}; + +static unsigned char gmime_datetok_table[256] = { + 128,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111, 79, 79,111,175,111,175,111,111, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,119,111,111,111,111,111, + 111, 75,111, 79, 75, 79,105, 79,111,111,107,111,111, 73, 75,107, + 79,111,111, 73, 77, 79,111,109,111, 79, 79,111,111,111,111,111, + 111,105,107,107,109,105,111,107,105,105,111,111,107,107,105,105, + 107,111,105,105,105,105,107,111,111,105,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111, +}; + +/* Timezone values defined in rfc5322 */ +static struct { + const char *name; + int offset; +} tz_offsets [] = { + { "UT", 0 }, + { "GMT", 0 }, + { "EDT", -400 }, + { "EST", -500 }, + { "CDT", -500 }, + { "CST", -600 }, + { "MDT", -600 }, + { "MST", -700 }, + { "PDT", -700 }, + { "PST", -800 }, + /* Note: rfc822 got the signs backwards for the military + * timezones so some sending clients may mistakenly use the + * wrong values. */ + { "A", 100 }, + { "B", 200 }, + { "C", 300 }, + { "D", 400 }, + { "E", 500 }, + { "F", 600 }, + { "G", 700 }, + { "H", 800 }, + { "I", 900 }, + { "K", 1000 }, + { "L", 1100 }, + { "M", 1200 }, + { "N", -100 }, + { "O", -200 }, + { "P", -300 }, + { "Q", -400 }, + { "R", -500 }, + { "S", -600 }, + { "T", -700 }, + { "U", -800 }, + { "V", -900 }, + { "W", -1000 }, + { "X", -1100 }, + { "Y", -1200 }, + { "Z", 0 }, +}; + +static char *tm_months[] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; + +static char *tm_days[] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" +}; + + +/** + * g_mime_utils_header_format_date: + * @date: time_t date representation + * @tz_offset: Timezone offset + * + * Allocates a string buffer containing the rfc822 formatted date + * string represented by @time and @tz_offset. + * + * Returns: a valid string representation of the date. + **/ +char * +g_mime_utils_header_format_date (time_t date, int tz_offset) +{ + struct tm tm; + + date += ((tz_offset / 100) * (60 * 60)) + (tz_offset % 100) * 60; + +#if defined (HAVE_GMTIME_R) + gmtime_r (&date, &tm); +#elif defined (HAVE_GMTIME_S) + gmtime_s (&tm, &date); +#else + memcpy (&tm, gmtime (&date), sizeof (tm)); +#endif + + return g_strdup_printf ("%s, %02d %s %04d %02d:%02d:%02d %+05d", + tm_days[tm.tm_wday], tm.tm_mday, + tm_months[tm.tm_mon], + tm.tm_year + 1900, + tm.tm_hour, tm.tm_min, tm.tm_sec, + tz_offset); +} + +/* This is where it gets ugly... */ + +typedef struct _date_token { + struct _date_token *next; + unsigned char mask; + const char *start; + size_t len; +} date_token; + +#define date_token_free(tok) g_slice_free (date_token, tok) +#define date_token_new() g_slice_new (date_token) + +static date_token * +datetok (const char *date) +{ + date_token tokens, *token, *tail; + const char *start, *end; + unsigned char mask; + + tail = (date_token *) &tokens; + tokens.next = NULL; + + start = date; + while (*start) { + /* kill leading whitespace */ + while (*start == ' ' || *start == '\t') + start++; + + if (*start == '\0') + break; + + mask = gmime_datetok_table[(unsigned char) *start]; + + /* find the end of this token */ + end = start + 1; + while (*end && !strchr ("-/,\t\r\n ", *end)) + mask |= gmime_datetok_table[(unsigned char) *end++]; + + if (end != start) { + token = date_token_new (); + token->next = NULL; + token->start = start; + token->len = end - start; + token->mask = mask; + + tail->next = token; + tail = token; + } + + if (*end) + start = end + 1; + else + break; + } + + return tokens.next; +} + +static int +decode_int (const char *in, size_t inlen) +{ + register const char *inptr; + int sign = 1, val = 0; + const char *inend; + + inptr = in; + inend = in + inlen; + + if (*inptr == '-') { + sign = -1; + inptr++; + } else if (*inptr == '+') + inptr++; + + for ( ; inptr < inend; inptr++) { + if (!(*inptr >= '0' && *inptr <= '9')) + return -1; + else + val = (val * 10) + (*inptr - '0'); + } + + val *= sign; + + return val; +} + +#if 0 +static int +get_days_in_month (int month, int year) +{ + switch (month) { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + return 31; + case 4: + case 6: + case 9: + case 11: + return 30; + case 2: + if (g_date_is_leap_year (year)) + return 29; + else + return 28; + default: + return 0; + } +} +#endif + +static int +get_wday (const char *in, size_t inlen) +{ + int wday; + + g_return_val_if_fail (in != NULL, -1); + + if (inlen < 3) + return -1; + + for (wday = 0; wday < 7; wday++) { + if (!g_ascii_strncasecmp (in, tm_days[wday], 3)) + return wday; + } + + return -1; /* unknown week day */ +} + +static int +get_mday (const char *in, size_t inlen) +{ + int mday; + + g_return_val_if_fail (in != NULL, -1); + + mday = decode_int (in, inlen); + + if (mday < 0 || mday > 31) + mday = -1; + + return mday; +} + +static int +get_month (const char *in, size_t inlen) +{ + int i; + + g_return_val_if_fail (in != NULL, -1); + + if (inlen < 3) + return -1; + + for (i = 0; i < 12; i++) { + if (!g_ascii_strncasecmp (in, tm_months[i], 3)) + return i; + } + + return -1; /* unknown month */ +} + +static int +get_year (const char *in, size_t inlen) +{ + int year; + + g_return_val_if_fail (in != NULL, -1); + + if ((year = decode_int (in, inlen)) == -1) + return -1; + + if (year < 100) + year += (year < 70) ? 2000 : 1900; + + if (year < 1969) + return -1; + + return year; +} + +static gboolean +get_time (const char *in, size_t inlen, int *hour, int *min, int *sec) +{ + register const char *inptr; + int *val, colons = 0; + const char *inend; + + *hour = *min = *sec = 0; + + inend = in + inlen; + val = hour; + for (inptr = in; inptr < inend; inptr++) { + if (*inptr == ':') { + colons++; + switch (colons) { + case 1: + val = min; + break; + case 2: + val = sec; + break; + default: + return FALSE; + } + } else if (!(*inptr >= '0' && *inptr <= '9')) + return FALSE; + else + *val = (*val * 10) + (*inptr - '0'); + } + + return TRUE; +} + +static int +get_tzone (date_token **token) +{ + const char *inptr, *inend; + size_t inlen; + int i, t; + + for (i = 0; *token && i < 2; *token = (*token)->next, i++) { + inptr = (*token)->start; + inlen = (*token)->len; + inend = inptr + inlen; + + if (*inptr == '+' || *inptr == '-') { + return decode_int (inptr, inlen); + } else { + if (*inptr == '(') { + inptr++; + if (*(inend - 1) == ')') + inlen -= 2; + else + inlen--; + } + + for (t = 0; t < 15; t++) { + size_t len = strlen (tz_offsets[t].name); + + if (len != inlen) + continue; + + if (!strncmp (inptr, tz_offsets[t].name, len)) + return tz_offsets[t].offset; + } + } + } + + return -1; +} + +static time_t +mktime_utc (struct tm *tm) +{ + time_t tt; + long tz; + + tm->tm_isdst = -1; + tt = mktime (tm); + +#if defined (G_OS_WIN32) && !defined (__MINGW32__) + _get_timezone (&tz); + if (tm->tm_isdst > 0) { + int dst; + + _get_dstbias (&dst); + tz += dst; + } +#elif defined (HAVE_TM_GMTOFF) + tz = -tm->tm_gmtoff; +#elif defined (HAVE_TIMEZONE) + if (tm->tm_isdst > 0) { +#if defined (HAVE_ALTZONE) + tz = altzone; +#else /* !defined (HAVE_ALTZONE) */ + tz = (timezone - 3600); +#endif + } else { + tz = timezone; + } +#elif defined (HAVE__TIMEZONE) + tz = _timezone; +#else +#error Neither HAVE_TIMEZONE nor HAVE_TM_GMTOFF defined. Rerun autoheader, autoconf, etc. +#endif + + return tt - tz; +} + +static time_t +parse_rfc822_date (date_token *tokens, int *tzone) +{ + int hour, min, sec, offset, n; + date_token *token; + struct tm tm; + time_t t; + + g_return_val_if_fail (tokens != NULL, (time_t) 0); + + token = tokens; + + memset ((void *) &tm, 0, sizeof (struct tm)); + + if ((n = get_wday (token->start, token->len)) != -1) { + /* not all dates may have this... */ + tm.tm_wday = n; + token = token->next; + } + + /* get the mday */ + if (!token || (n = get_mday (token->start, token->len)) == -1) + return (time_t) 0; + + tm.tm_mday = n; + token = token->next; + + /* get the month */ + if (!token || (n = get_month (token->start, token->len)) == -1) + return (time_t) 0; + + tm.tm_mon = n; + token = token->next; + + /* get the year */ + if (!token || (n = get_year (token->start, token->len)) == -1) + return (time_t) 0; + + tm.tm_year = n - 1900; + token = token->next; + + /* get the hour/min/sec */ + if (!token || !get_time (token->start, token->len, &hour, &min, &sec)) + return (time_t) 0; + + tm.tm_hour = hour; + tm.tm_min = min; + tm.tm_sec = sec; + token = token->next; + + /* get the timezone */ + if (!token || (n = get_tzone (&token)) == -1) { + /* I guess we assume tz is GMT? */ + offset = 0; + } else { + offset = n; + } + + t = mktime_utc (&tm); + + /* t is now GMT of the time we want, but not offset by the timezone ... */ + + /* this should convert the time to the GMT equiv time */ + t -= ((offset / 100) * 60 * 60) + (offset % 100) * 60; + + if (tzone) + *tzone = offset; + + return t; +} + + +#define date_token_mask(t) (((date_token *) t)->mask) +#define is_numeric(t) ((date_token_mask (t) & DATE_TOKEN_NON_NUMERIC) == 0) +#define is_weekday(t) ((date_token_mask (t) & DATE_TOKEN_NON_WEEKDAY) == 0) +#define is_month(t) ((date_token_mask (t) & DATE_TOKEN_NON_MONTH) == 0) +#define is_time(t) (((date_token_mask (t) & DATE_TOKEN_NON_TIME) == 0) && (date_token_mask (t) & DATE_TOKEN_HAS_COLON)) +#define is_tzone_alpha(t) ((date_token_mask (t) & DATE_TOKEN_NON_TIMEZONE_ALPHA) == 0) +#define is_tzone_numeric(t) (((date_token_mask (t) & DATE_TOKEN_NON_TIMEZONE_NUMERIC) == 0) && (date_token_mask (t) & DATE_TOKEN_HAS_SIGN)) +#define is_tzone(t) (is_tzone_alpha (t) || is_tzone_numeric (t)) + +static time_t +parse_broken_date (date_token *tokens, int *tzone) +{ + gboolean got_wday, got_month, got_tzone; + int hour, min, sec, offset, n; + date_token *token; + struct tm tm; + time_t t; + + memset ((void *) &tm, 0, sizeof (struct tm)); + got_wday = got_month = got_tzone = FALSE; + offset = 0; + + token = tokens; + while (token) { + if (is_weekday (token) && !got_wday) { + if ((n = get_wday (token->start, token->len)) != -1) { + d(printf ("weekday; ")); + got_wday = TRUE; + tm.tm_wday = n; + goto next; + } + } + + if (is_month (token) && !got_month) { + if ((n = get_month (token->start, token->len)) != -1) { + d(printf ("month; ")); + got_month = TRUE; + tm.tm_mon = n; + goto next; + } + } + + if (is_time (token) && !tm.tm_hour && !tm.tm_min && !tm.tm_sec) { + if (get_time (token->start, token->len, &hour, &min, &sec)) { + d(printf ("time; ")); + tm.tm_hour = hour; + tm.tm_min = min; + tm.tm_sec = sec; + goto next; + } + } + + if (is_tzone (token) && !got_tzone) { + date_token *t = token; + + if ((n = get_tzone (&t)) != -1) { + d(printf ("tzone; ")); + got_tzone = TRUE; + offset = n; + goto next; + } + } + + if (is_numeric (token)) { + if (token->len == 4 && !tm.tm_year) { + if ((n = get_year (token->start, token->len)) != -1) { + d(printf ("year; ")); + tm.tm_year = n - 1900; + goto next; + } + } else { + /* Note: assumes MM-DD-YY ordering if '0 < MM < 12' holds true */ + if (!got_month && token->next && is_numeric (token->next)) { + if ((n = decode_int (token->start, token->len)) > 12) { + goto mday; + } else if (n > 0) { + d(printf ("mon; ")); + got_month = TRUE; + tm.tm_mon = n - 1; + } + goto next; + } else if (!tm.tm_mday && (n = get_mday (token->start, token->len)) != -1) { + mday: + d(printf ("mday; ")); + tm.tm_mday = n; + goto next; + } else if (!tm.tm_year) { + if ((n = get_year (token->start, token->len)) != -1) { + d(printf ("2-digit year; ")); + tm.tm_year = n - 1900; + } + goto next; + } + } + } + + d(printf ("???; ")); + + next: + + token = token->next; + } + + d(printf ("\n")); + + t = mktime_utc (&tm); + + /* t is now GMT of the time we want, but not offset by the timezone ... */ + + /* this should convert the time to the GMT equiv time */ + t -= ((offset / 100) * 60 * 60) + (offset % 100) * 60; + + if (tzone) + *tzone = offset; + + return t; +} + +#if 0 +static void +gmime_datetok_table_init (void) +{ + int i; + + memset (gmime_datetok_table, 0, sizeof (gmime_datetok_table)); + + for (i = 0; i < 256; i++) { + if (!strchr (NUMERIC_CHARS, i)) + gmime_datetok_table[i] |= DATE_TOKEN_NON_NUMERIC; + + if (!strchr (WEEKDAY_CHARS, i)) + gmime_datetok_table[i] |= DATE_TOKEN_NON_WEEKDAY; + + if (!strchr (MONTH_CHARS, i)) + gmime_datetok_table[i] |= DATE_TOKEN_NON_MONTH; + + if (!strchr (TIME_CHARS, i)) + gmime_datetok_table[i] |= DATE_TOKEN_NON_TIME; + + if (!strchr (TIMEZONE_ALPHA_CHARS, i)) + gmime_datetok_table[i] |= DATE_TOKEN_NON_TIMEZONE_ALPHA; + + if (!strchr (TIMEZONE_NUMERIC_CHARS, i)) + gmime_datetok_table[i] |= DATE_TOKEN_NON_TIMEZONE_NUMERIC; + + if (((char) i) == ':') + gmime_datetok_table[i] |= DATE_TOKEN_HAS_COLON; + + if (strchr ("+-", i)) + gmime_datetok_table[i] |= DATE_TOKEN_HAS_SIGN; + } + + printf ("static unsigned char gmime_datetok_table[256] = {"); + for (i = 0; i < 256; i++) { + if (i % 16 == 0) + printf ("\n\t"); + printf ("%3d,", gmime_datetok_table[i]); + } + printf ("\n};\n"); +} +#endif + + +/** + * g_mime_utils_header_decode_date: + * @str: input date string + * @tz_offset: timezone offset + * + * Decodes the rfc822 date string and saves the GMT offset into + * @tz_offset if non-NULL. + * + * Returns: the time_t representation of the date string specified by + * @str or (time_t) %0 on error. If @tz_offset is non-NULL, the value + * of the timezone offset will be stored. + **/ +time_t +g_mime_utils_header_decode_date (const char *str, int *tz_offset) +{ + date_token *token, *tokens; + time_t date; + + if (!(tokens = datetok (str))) { + if (tz_offset) + *tz_offset = 0; + + return (time_t) 0; + } + + if (!(date = parse_rfc822_date (tokens, tz_offset))) + date = parse_broken_date (tokens, tz_offset); + + /* cleanup */ + while (tokens) { + token = tokens; + tokens = tokens->next; + date_token_free (token); + } + + return date; +} + + +/** + * g_mime_utils_generate_message_id: + * @fqdn: Fully qualified domain name + * + * Generates a unique Message-Id. + * + * Returns: a unique string in an addr-spec format suitable for use as + * a Message-Id. + **/ +char * +g_mime_utils_generate_message_id (const char *fqdn) +{ +#ifdef G_THREADS_ENABLED + static GStaticMutex mutex = G_STATIC_MUTEX_INIT; +#define MUTEX_LOCK() g_static_mutex_lock (&mutex) +#define MUTEX_UNLOCK() g_static_mutex_unlock (&mutex) +#else +#define MUTEX_LOCK() +#define MUTEX_UNLOCK() +#endif + static unsigned long int count = 0; + const char *hostname = NULL; + char *name = NULL; + char *msgid; + + if (!fqdn) { +#ifdef HAVE_UTSNAME_DOMAINNAME + struct utsname unam; + + uname (&unam); + + hostname = unam.nodename; + + if (unam.domainname[0]) + name = g_strdup_printf ("%s.%s", hostname, unam.domainname); +#else /* ! HAVE_UTSNAME_DOMAINNAME */ + char host[MAXHOSTNAMELEN + 1]; + +#ifdef HAVE_GETHOSTNAME + host[MAXHOSTNAMELEN] = '\0'; + if (gethostname (host, MAXHOSTNAMELEN) == 0) { +#ifdef HAVE_GETDOMAINNAME + size_t domainlen = MAXHOSTNAMELEN; + char *domain; + int rv; + + domain = g_malloc (domainlen); + + while ((rv = getdomainname (domain, domainlen)) == -1 && errno == EINVAL) { + domainlen += MAXHOSTNAMELEN; + domain = g_realloc (domain, domainlen); + } + + if (rv == 0 && domain[0]) { + if (host[0]) { + name = g_strdup_printf ("%s.%s", host, domain); + g_free (domain); + } else { + name = domain; + } + } +#endif /* HAVE_GETDOMAINNAME */ + } else { + host[0] = '\0'; + } +#endif /* HAVE_GETHOSTNAME */ + hostname = host; +#endif /* HAVE_UTSNAME_DOMAINNAME */ + +#ifdef HAVE_GETADDRINFO + if (!name && hostname[0]) { + /* we weren't able to get a domain name */ + struct addrinfo hints, *res; + + memset (&hints, 0, sizeof (hints)); + hints.ai_flags = AI_CANONNAME; + + if (getaddrinfo (hostname, NULL, &hints, &res) == 0) { + name = g_strdup (res->ai_canonname); + freeaddrinfo (res); + } + } +#endif /* HAVE_GETADDRINFO */ + + fqdn = name != NULL ? name : (hostname[0] ? hostname : "localhost.localdomain"); + } + + MUTEX_LOCK (); + msgid = g_strdup_printf ("%lu.%lu.%lu@%s", (unsigned long int) time (NULL), + (unsigned long int) getpid (), count++, fqdn); + MUTEX_UNLOCK (); + + g_free (name); + + return msgid; +} + +static char * +decode_addrspec (const char **in) +{ + const char *word, *inptr; + GString *addrspec; + char *str; + + decode_lwsp (in); + inptr = *in; + + if (!(word = decode_word (&inptr))) { + w(g_warning ("No local-part in addr-spec: %s", *in)); + return NULL; + } + + addrspec = g_string_new (""); + g_string_append_len (addrspec, word, (size_t) (inptr - word)); + + /* get the rest of the local-part */ + decode_lwsp (&inptr); + while (*inptr == '.') { + g_string_append_c (addrspec, *inptr++); + if ((word = decode_word (&inptr))) { + g_string_append_len (addrspec, word, (size_t) (inptr - word)); + decode_lwsp (&inptr); + } else { + w(g_warning ("Invalid local-part in addr-spec: %s", *in)); + goto exception; + } + } + + /* we should be at the '@' now... */ + if (*inptr++ != '@') { + w(g_warning ("Invalid addr-spec; missing '@': %s", *in)); + goto exception; + } + + g_string_append_c (addrspec, '@'); + if (!decode_domain (&inptr, addrspec)) { + w(g_warning ("No domain in addr-spec: %s", *in)); + goto exception; + } + + str = addrspec->str; + g_string_free (addrspec, FALSE); + + *in = inptr; + + return str; + + exception: + + g_string_free (addrspec, TRUE); + + return NULL; +} + +static char * +decode_msgid (const char **in) +{ + const char *inptr = *in; + char *msgid = NULL; + + decode_lwsp (&inptr); + if (*inptr != '<') { + w(g_warning ("Invalid msg-id; missing '<': %s", *in)); + } else { + inptr++; + } + + decode_lwsp (&inptr); + if ((msgid = decode_addrspec (&inptr))) { + decode_lwsp (&inptr); + if (*inptr != '>') { + w(g_warning ("Invalid msg-id; missing '>': %s", *in)); + } else { + inptr++; + } + + *in = inptr; + } else { + w(g_warning ("Invalid msg-id; missing addr-spec: %s", *in)); + *in = inptr; + while (*inptr && *inptr != '>') + inptr++; + + msgid = g_strndup (*in, (size_t) (inptr - *in)); + *in = inptr; + } + + return msgid; +} + + +/** + * g_mime_utils_decode_message_id: + * @message_id: string containing a message-id + * + * Decodes a msg-id as defined by rfc822. + * + * Returns: the addr-spec portion of the msg-id. + **/ +char * +g_mime_utils_decode_message_id (const char *message_id) +{ + g_return_val_if_fail (message_id != NULL, NULL); + + return decode_msgid (&message_id); +} + + +/** + * g_mime_references_decode: + * @text: string containing a list of msg-ids + * + * Decodes a list of msg-ids as in the References and/or In-Reply-To + * headers defined in rfc822. + * + * Returns: a list of referenced msg-ids. + **/ +GMimeReferences * +g_mime_references_decode (const char *text) +{ + GMimeReferences refs, *tail, *ref; + const char *word, *inptr = text; + char *msgid; + + g_return_val_if_fail (text != NULL, NULL); + + tail = (GMimeReferences *) &refs; + refs.next = NULL; + + while (*inptr) { + decode_lwsp (&inptr); + if (*inptr == '<') { + /* looks like a msg-id */ + if ((msgid = decode_msgid (&inptr))) { + ref = g_new (GMimeReferences, 1); + ref->next = NULL; + ref->msgid = msgid; + tail->next = ref; + tail = ref; + } else { + w(g_warning ("Invalid References header: %s", inptr)); + break; + } + } else if (*inptr) { + /* looks like part of a phrase */ + if (!(word = decode_word (&inptr))) { + w(g_warning ("Invalid References header: %s", inptr)); + break; + } + } + } + + return refs.next; +} + + +/** + * g_mime_references_append: + * @refs: the address of a #GMimeReferences list + * @msgid: a message-id string + * + * Appends a reference to msgid to the list of references. + **/ +void +g_mime_references_append (GMimeReferences **refs, const char *msgid) +{ + GMimeReferences *ref; + + g_return_if_fail (refs != NULL); + g_return_if_fail (msgid != NULL); + + ref = (GMimeReferences *) refs; + while (ref->next) + ref = ref->next; + + ref->next = g_new (GMimeReferences, 1); + ref->next->msgid = g_strdup (msgid); + ref->next->next = NULL; +} + + +/** + * g_mime_references_free: + * @refs: a #GMimeReferences list + * + * Frees the #GMimeReferences list. + **/ +void +g_mime_references_free (GMimeReferences *refs) +{ + GMimeReferences *ref, *next; + + ref = refs; + while (ref) { + next = ref->next; + g_free (ref->msgid); + g_free (ref); + ref = next; + } +} + + +/** + * g_mime_references_clear: + * @refs: address of a #GMimeReferences list + * + * Clears the #GMimeReferences list and resets it to %NULL. + **/ +void +g_mime_references_clear (GMimeReferences **refs) +{ + g_return_if_fail (refs != NULL); + + g_mime_references_free (*refs); + *refs = NULL; +} + + +/** + * g_mime_references_get_next: + * @ref: a #GMimeReferences list + * + * Advances to the next reference node in the #GMimeReferences list. + * + * Returns: the next reference node in the #GMimeReferences list. + **/ +const GMimeReferences * +g_mime_references_get_next (const GMimeReferences *ref) +{ + return ref ? ref->next : NULL; +} + + +/** + * g_mime_references_get_message_id: + * @ref: a #GMimeReferences list + * + * Gets the Message-Id reference from the #GMimeReferences node. + * + * Returns: the Message-Id reference from the #GMimeReferences node. + **/ +const char * +g_mime_references_get_message_id (const GMimeReferences *ref) +{ + return ref ? ref->msgid : NULL; +} + + +static gboolean +is_rfc2047_token (const char *inptr, size_t len) +{ + if (len < 8 || strncmp (inptr, "=?", 2) != 0 || strncmp (inptr + len - 2, "?=", 2) != 0) + return FALSE; + + inptr += 2; + len -= 2; + + /* skip past the charset */ + while (*inptr != '?' && len > 0) { + inptr++; + len--; + } + + if (*inptr != '?' || len < 4) + return FALSE; + + if (inptr[1] != 'q' && inptr[1] != 'Q' && inptr[1] != 'b' && inptr[1] != 'B') + return FALSE; + + inptr += 2; + len -= 2; + + if (*inptr != '?') + return FALSE; + + return TRUE; +} + +static char * +header_fold (const char *in, gboolean structured) +{ + gboolean last_was_lwsp = FALSE; + register const char *inptr; + size_t len, outlen, i; + size_t fieldlen; + GString *out; + char *ret; + + inptr = in; + len = strlen (in); + if (len <= GMIME_FOLD_LEN + 1) + return g_strdup (in); + + out = g_string_new (""); + fieldlen = strcspn (inptr, ": \t\n"); + g_string_append_len (out, inptr, fieldlen); + outlen = fieldlen; + inptr += fieldlen; + + while (*inptr && *inptr != '\n') { + len = strcspn (inptr, " \t\n"); + + if (len > 1 && outlen + len > GMIME_FOLD_LEN) { + if (outlen > 1 && out->len >= fieldlen + 2) { + if (last_was_lwsp) { + if (structured) + out->str[out->len - 1] = '\t'; + + g_string_insert_c (out, out->len - 1, '\n'); + } else + g_string_append (out, "\n\t"); + + outlen = 1; + } + + if (!structured && !is_rfc2047_token (inptr, len)) { + /* check for very long words, just cut them up */ + while (outlen + len > GMIME_FOLD_LEN) { + for (i = 0; i < GMIME_FOLD_LEN - outlen; i++) + g_string_append_c (out, inptr[i]); + inptr += GMIME_FOLD_LEN - outlen; + len -= GMIME_FOLD_LEN - outlen; + g_string_append (out, "\n\t"); + outlen = 1; + } + } else { + g_string_append_len (out, inptr, len); + outlen += len; + inptr += len; + } + last_was_lwsp = FALSE; + } else if (len > 0) { + g_string_append_len (out, inptr, len); + outlen += len; + inptr += len; + last_was_lwsp = FALSE; + } else { + last_was_lwsp = TRUE; + if (*inptr == '\t') { + /* tabs are a good place to fold, odds + are that this is where the previous + mailer folded it */ + g_string_append (out, "\n\t"); + outlen = 1; + while (is_blank (*inptr)) + inptr++; + } else { + g_string_append_c (out, *inptr++); + outlen++; + } + } + } + + if (*inptr == '\n' && out->str[out->len - 1] != '\n') + g_string_append_c (out, '\n'); + + ret = out->str; + g_string_free (out, FALSE); + + return ret; +} + + +/** + * g_mime_utils_structured_header_fold: + * @str: input string + * + * Folds a structured header according to the rules in rfc822. + * + * Returns: an allocated string containing the folded header. + **/ +char * +g_mime_utils_structured_header_fold (const char *str) +{ + return header_fold (str, TRUE); +} + + +/** + * g_mime_utils_unstructured_header_fold: + * @str: input string + * + * Folds an unstructured header according to the rules in rfc822. + * + * Returns: an allocated string containing the folded header. + **/ +char * +g_mime_utils_unstructured_header_fold (const char *str) +{ + return header_fold (str, FALSE); +} + + +/** + * g_mime_utils_header_fold: + * @str: input string + * + * Folds a structured header according to the rules in rfc822. + * + * Returns: an allocated string containing the folded header. + **/ +char * +g_mime_utils_header_fold (const char *str) +{ + return header_fold (str, TRUE); +} + + +/** + * g_mime_utils_header_printf: + * @format: string format + * @Varargs: arguments + * + * Allocates a buffer containing a formatted header specified by the + * @Varargs. + * + * Returns: an allocated string containing the folded header specified + * by @format and the following arguments. + **/ +char * +g_mime_utils_header_printf (const char *format, ...) +{ + char *buf, *ret; + va_list ap; + + va_start (ap, format); + buf = g_strdup_vprintf (format, ap); + va_end (ap); + + ret = header_fold (buf, TRUE); + g_free (buf); + + return ret; +} + +static gboolean +need_quotes (const char *string) +{ + gboolean quoted = FALSE; + const char *inptr; + + inptr = string; + + while (*inptr) { + if (*inptr == '\\') + inptr++; + else if (*inptr == '"') + quoted = !quoted; + else if (!quoted && (is_tspecial (*inptr) || *inptr == '.')) + return TRUE; + + if (*inptr) + inptr++; + } + + return FALSE; +} + +/** + * g_mime_utils_quote_string: + * @str: input string + * + * Quotes @string as needed according to the rules in rfc2045. + * + * Returns: an allocated string containing the escaped and quoted (if + * needed to be) input string. The decision to quote the string is + * based on whether or not the input string contains any 'tspecials' + * as defined by rfc2045. + **/ +char * +g_mime_utils_quote_string (const char *str) +{ + gboolean quote; + const char *c; + char *qstring; + GString *out; + + out = g_string_new (""); + + if ((quote = need_quotes (str))) + g_string_append_c (out, '"'); + + for (c = str; *c; c++) { + if ((*c == '"' && quote) || *c == '\\') + g_string_append_c (out, '\\'); + + g_string_append_c (out, *c); + } + + if (quote) + g_string_append_c (out, '"'); + + qstring = out->str; + g_string_free (out, FALSE); + + return qstring; +} + + +/** + * g_mime_utils_unquote_string: + * @str: input string + * + * Unquotes and unescapes a string. + **/ +void +g_mime_utils_unquote_string (char *str) +{ + /* if the string is quoted, unquote it */ + register char *inptr = str; + int escaped = FALSE; + int quoted = FALSE; + + if (!str) + return; + + while (*inptr) { + if (*inptr == '\\') { + if (escaped) + *str++ = *inptr++; + else + inptr++; + escaped = !escaped; + } else if (*inptr == '"') { + if (escaped) { + *str++ = *inptr++; + escaped = FALSE; + } else { + quoted = !quoted; + inptr++; + } + } else { + *str++ = *inptr++; + escaped = FALSE; + } + } + + *str = '\0'; +} + + +/** + * g_mime_utils_text_is_8bit: + * @text: text to check for 8bit chars + * @len: text length + * + * Determines if @text contains 8bit characters within the first @len + * bytes. + * + * Returns: %TRUE if the text contains 8bit characters or %FALSE + * otherwise. + **/ +gboolean +g_mime_utils_text_is_8bit (const unsigned char *text, size_t len) +{ + register const unsigned char *inptr; + const unsigned char *inend; + + g_return_val_if_fail (text != NULL, FALSE); + + inend = text + len; + for (inptr = text; *inptr && inptr < inend; inptr++) + if (*inptr > (unsigned char) 127) + return TRUE; + + return FALSE; +} + + +/** + * g_mime_utils_best_encoding: + * @text: text to encode + * @len: text length + * + * Determines the best content encoding for the first @len bytes of + * @text. + * + * Returns: a #GMimeContentEncoding that is determined to be the best + * encoding type for the specified block of text. ("best" in this + * particular case means smallest output size) + **/ +GMimeContentEncoding +g_mime_utils_best_encoding (const unsigned char *text, size_t len) +{ + const unsigned char *ch, *inend; + size_t count = 0; + + inend = text + len; + for (ch = text; ch < inend; ch++) + if (*ch > (unsigned char) 127) + count++; + + if ((float) count <= len * 0.17) + return GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE; + else + return GMIME_CONTENT_ENCODING_BASE64; +} + + +/** + * charset_convert: + * @cd: iconv converter + * @inbuf: input text buffer to convert + * @inleft: length of the input buffer + * @outp: pointer to output buffer + * @outlenp: pointer to output buffer length + * @ninval: the number of invalid bytes in @inbuf + * + * Converts the input buffer from one charset to another using the + * @cd. On completion, @outp will point to the output buffer + * containing the converted text (nul-terminated), @outlenp will be + * the size of the @outp buffer (note: not the strlen() of @outp) and + * @ninval will contain the number of bytes which could not be + * converted. + * + * Bytes which cannot be converted from @inbuf will appear as '?' + * characters in the output buffer. + * + * If *@outp is non-NULL, then it is assumed that it points to a + * pre-allocated buffer of length *@outlenp. This is done so that the + * same output buffer can be reused multiple times. + * + * Returns: the string length of the output buffer. + **/ +static size_t +charset_convert (iconv_t cd, const char *inbuf, size_t inleft, char **outp, size_t *outlenp, size_t *ninval) +{ + size_t outlen, outleft, rc, n = 0; + char *outbuf, *out; + + if (*outp == NULL) { + outleft = outlen = (inleft * 2) + 16; + outbuf = out = g_malloc (outlen + 1); + } else { + outleft = outlen = *outlenp; + outbuf = out = *outp; + } + + do { + rc = iconv (cd, (char **) &inbuf, &inleft, &outbuf, &outleft); + if (rc == (size_t) -1) { + if (errno == EINVAL) { + /* incomplete sequence at the end of the input buffer */ + n += inleft; + break; + } + +#ifdef G_OS_WIN32 + /* seems that GnuWin32's libiconv 1.9 does not set errno in + * the E2BIG case, so we have to fake it */ + if (outleft <= inleft) + errno = E2BIG; +#endif + + if (errno == E2BIG || outleft == 0) { + /* need to grow the output buffer */ + outlen += (inleft * 2) + 16; + rc = (size_t) (outbuf - out); + out = g_realloc (out, outlen + 1); + outleft = outlen - rc; + outbuf = out + rc; + } + + /* Note: GnuWin32's libiconv 1.9 can also set errno to ERANGE + * which seems to mean that it encountered a character that + * does not fit the specified 'from' charset. We'll handle + * that the same way we handle EILSEQ. */ + if (errno == EILSEQ || errno == ERANGE) { + /* invalid or incomplete multibyte + * sequence in the input buffer */ + *outbuf++ = '?'; + outleft--; + inleft--; + inbuf++; + n++; + } + } + } while (inleft > 0); + + while (iconv (cd, NULL, NULL, &outbuf, &outleft) == (size_t) -1) { + if (errno != E2BIG) + break; + + outlen += 16; + rc = (size_t) (outbuf - out); + out = g_realloc (out, outlen + 1); + outleft = outlen - rc; + outbuf = out + rc; + } + + *outbuf = '\0'; + + *outlenp = outlen; + *outp = out; + *ninval = n; + + return (outbuf - out); +} + + +#define USER_CHARSETS_INCLUDE_UTF8 (1 << 0) +#define USER_CHARSETS_INCLUDE_LOCALE (1 << 1) +#define USER_CHARSETS_INCLUDE_LATIN1 (1 << 2) + + +/** + * g_mime_utils_decode_8bit: + * @text: input text in unknown 8bit/multibyte character set + * @len: input text length + * + * Attempts to convert text in an unknown 8bit/multibyte charset into + * UTF-8 by finding the charset which will convert the most bytes into + * valid UTF-8 characters as possible. If no exact match can be found, + * it will choose the best match and convert invalid byte sequences + * into question-marks (?) in the returned string buffer. + * + * Returns: a UTF-8 string representation of @text. + **/ +char * +g_mime_utils_decode_8bit (const char *text, size_t len) +{ + const char **charsets, **user_charsets, *locale, *best; + size_t outleft, outlen, min, ninval; + unsigned int included = 0; + iconv_t cd; + char *out; + int i = 0; + + g_return_val_if_fail (text != NULL, NULL); + + locale = g_mime_locale_charset (); + if (!g_ascii_strcasecmp (locale, "iso-8859-1") || + !g_ascii_strcasecmp (locale, "UTF-8")) { + /* If the user's locale charset is either of these, we + * don't need to include the locale charset in our list + * of fallback charsets. */ + included |= USER_CHARSETS_INCLUDE_LOCALE; + } + + if ((user_charsets = g_mime_user_charsets ())) { + while (user_charsets[i]) + i++; + } + + charsets = g_alloca (sizeof (char *) * (i + 4)); + i = 0; + + if (user_charsets) { + while (user_charsets[i]) { + /* keep a record of whether or not the user-supplied + * charsets include UTF-8, Latin1, or the user's locale + * charset so that we avoid doubling our efforts for + * these 3 charsets. We could have used a hash table + * to keep track of unique charsets, but we can + * (hopefully) assume that user_charsets is a unique + * list of charsets with no duplicates. */ + if (!g_ascii_strcasecmp (user_charsets[i], "iso-8859-1")) + included |= USER_CHARSETS_INCLUDE_LATIN1; + + if (!g_ascii_strcasecmp (user_charsets[i], "UTF-8")) + included |= USER_CHARSETS_INCLUDE_UTF8; + + if (!g_ascii_strcasecmp (user_charsets[i], locale)) + included |= USER_CHARSETS_INCLUDE_LOCALE; + + charsets[i] = user_charsets[i]; + i++; + } + } + + if (!(included & USER_CHARSETS_INCLUDE_UTF8)) + charsets[i++] = "UTF-8"; + + if (!(included & USER_CHARSETS_INCLUDE_LOCALE)) + charsets[i++] = locale; + + if (!(included & USER_CHARSETS_INCLUDE_LATIN1)) + charsets[i++] = "iso-8859-1"; + + charsets[i] = NULL; + + min = len; + best = charsets[0]; + + outleft = (len * 2) + 16; + out = g_malloc (outleft + 1); + + for (i = 0; charsets[i]; i++) { + if ((cd = g_mime_iconv_open ("UTF-8", charsets[i])) == (iconv_t) -1) + continue; + + outlen = charset_convert (cd, text, len, &out, &outleft, &ninval); + + g_mime_iconv_close (cd); + + if (ninval == 0) + return g_realloc (out, outlen + 1); + + if (ninval < min) { + best = charsets[i]; + min = ninval; + } + } + + /* if we get here, then none of the charsets fit the 8bit text flawlessly... + * try to find the one that fit the best and use that to convert what we can, + * replacing any byte we can't convert with a '?' */ + + if ((cd = g_mime_iconv_open ("UTF-8", best)) == (iconv_t) -1) { + /* this shouldn't happen... but if we are here, then + * it did... the only thing we can do at this point + * is replace the 8bit garbage and pray */ + register const char *inptr = text; + const char *inend = inptr + len; + char *outbuf = out; + + while (inptr < inend) { + if (is_ascii (*inptr)) + *outbuf++ = *inptr; + else + *outbuf++ = '?'; + + inptr++; + } + + *outbuf++ = '\0'; + + return g_realloc (out, (size_t) (outbuf - out)); + } + + outlen = charset_convert (cd, text, len, &out, &outleft, &ninval); + + g_mime_iconv_close (cd); + + return g_realloc (out, outlen + 1); +} + + +/* this decodes rfc2047's version of quoted-printable */ +static size_t +quoted_decode (const unsigned char *in, size_t len, unsigned char *out, int *state, guint32 *save) +{ + register const unsigned char *inptr; + register unsigned char *outptr; + const unsigned char *inend; + unsigned char c, c1; + guint32 saved; + int need; + + if (len == 0) + return 0; + + inend = in + len; + outptr = out; + inptr = in; + + need = *state; + saved = *save; + + if (need > 0) { + if (isxdigit ((int) *inptr)) { + if (need == 1) { + c = g_ascii_toupper ((int) (saved & 0xff)); + c1 = g_ascii_toupper ((int) *inptr++); + saved = 0; + need = 0; + + goto decode; + } + + saved = 0; + need = 0; + + goto equals; + } + + /* last encoded-word ended in a malformed quoted-printable sequence */ + *outptr++ = '='; + + if (need == 1) + *outptr++ = (char) (saved & 0xff); + + saved = 0; + need = 0; + } + + while (inptr < inend) { + c = *inptr++; + if (c == '=') { + equals: + if (inend - inptr >= 2) { + if (isxdigit ((int) inptr[0]) && isxdigit ((int) inptr[1])) { + c = g_ascii_toupper (*inptr++); + c1 = g_ascii_toupper (*inptr++); + decode: + *outptr++ = (((c >= 'A' ? c - 'A' + 10 : c - '0') & 0x0f) << 4) + | ((c1 >= 'A' ? c1 - 'A' + 10 : c1 - '0') & 0x0f); + } else { + /* malformed quoted-printable sequence? */ + *outptr++ = '='; + } + } else { + /* truncated payload, maybe it was split across encoded-words? */ + if (inptr < inend) { + if (isxdigit ((int) *inptr)) { + saved = *inptr; + need = 1; + break; + } else { + /* malformed quoted-printable sequence? */ + *outptr++ = '='; + } + } else { + saved = 0; + need = 2; + break; + } + } + } else if (c == '_') { + /* _'s are an rfc2047 shortcut for encoding spaces */ + *outptr++ = ' '; + } else { + *outptr++ = c; + } + } + + *state = need; + *save = saved; + + return (size_t) (outptr - out); +} + +#define is_rfc2047_encoded_word(atom, len) (len >= 7 && !strncmp (atom, "=?", 2) && !strncmp (atom + len - 2, "?=", 2)) + +typedef struct _rfc2047_token { + struct _rfc2047_token *next; + const char *charset; + const char *text; + size_t length; + char encoding; + char is_8bit; +} rfc2047_token; + +#define rfc2047_token_list_free(tokens) g_slice_free_chain (rfc2047_token, tokens, next) +#define rfc2047_token_free(token) g_slice_free (rfc2047_token, token) + +static rfc2047_token * +rfc2047_token_new (const char *text, size_t len) +{ + rfc2047_token *token; + + token = g_slice_new0 (rfc2047_token); + token->length = len; + token->text = text; + + return token; +} + +static rfc2047_token * +rfc2047_token_new_encoded_word (const char *word, size_t len) +{ + rfc2047_token *token; + const char *payload; + const char *charset; + const char *inptr; + char *buf, *lang; + char encoding; + size_t n; + + /* check that this could even be an encoded-word token */ + if (len < 7 || strncmp (word, "=?", 2) != 0 || strncmp (word + len - 2, "?=", 2) != 0) + return NULL; + + /* skip over '=?' */ + inptr = word + 2; + charset = inptr; + + if (*charset == '?' || *charset == '*') { + /* this would result in an empty charset */ + return NULL; + } + + /* skip to the end of the charset */ + if (!(inptr = memchr (inptr, '?', len - 2)) || inptr[2] != '?') + return NULL; + + /* copy the charset into a buffer */ + n = (size_t) (inptr - charset); + buf = g_alloca (n + 1); + memcpy (buf, charset, n); + buf[n] = '\0'; + charset = buf; + + /* rfc2231 updates rfc2047 encoded words... + * The ABNF given in RFC 2047 for encoded-words is: + * encoded-word := "=?" charset "?" encoding "?" encoded-text "?=" + * This specification changes this ABNF to: + * encoded-word := "=?" charset ["*" language] "?" encoding "?" encoded-text "?=" + */ + + /* trim off the 'language' part if it's there... */ + if ((lang = strchr (charset, '*'))) + *lang = '\0'; + + /* skip over the '?' */ + inptr++; + + /* make sure the first char after the encoding is another '?' */ + if (inptr[1] != '?') + return NULL; + + switch (*inptr++) { + case 'B': case 'b': + encoding = 'B'; + break; + case 'Q': case 'q': + encoding = 'Q'; + break; + default: + return NULL; + } + + /* the payload begins right after the '?' */ + payload = inptr + 1; + + /* find the end of the payload */ + inptr = word + len - 2; + + /* make sure that we don't have something like: =?iso-8859-1?Q?= */ + if (payload > inptr) + return NULL; + + token = rfc2047_token_new (payload, inptr - payload); + token->charset = g_mime_charset_iconv_name (charset); + token->encoding = encoding; + + return token; +} + +static rfc2047_token * +tokenize_rfc2047_phrase (const char *in, size_t *len) +{ + gboolean enable_rfc2047_workarounds = _g_mime_enable_rfc2047_workarounds (); + rfc2047_token list, *lwsp, *token, *tail; + register const char *inptr = in; + gboolean encoded = FALSE; + const char *text, *word; + gboolean ascii; + size_t n; + + tail = (rfc2047_token *) &list; + list.next = NULL; + lwsp = NULL; + + while (*inptr != '\0') { + text = inptr; + while (is_lwsp (*inptr)) + inptr++; + + if (inptr > text) + lwsp = rfc2047_token_new (text, inptr - text); + else + lwsp = NULL; + + word = inptr; + ascii = TRUE; + if (is_atom (*inptr)) { + if (G_UNLIKELY (enable_rfc2047_workarounds)) { + /* Make an extra effort to detect and + * separate encoded-word tokens that + * have been merged with other + * words. */ + + if (!strncmp (inptr, "=?", 2)) { + inptr += 2; + + /* skip past the charset (if one is even declared, sigh) */ + while (*inptr && *inptr != '?') { + ascii = ascii && is_ascii (*inptr); + inptr++; + } + + /* sanity check encoding type */ + if (inptr[0] != '?' || !strchr ("BbQq", inptr[1]) || inptr[2] != '?') + goto non_rfc2047; + + inptr += 3; + + /* find the end of the rfc2047 encoded word token */ + while (*inptr && strncmp (inptr, "?=", 2) != 0) { + ascii = ascii && is_ascii (*inptr); + inptr++; + } + + if (*inptr == '\0') { + /* didn't find an end marker... */ + inptr = word + 2; + ascii = TRUE; + + goto non_rfc2047; + } + + inptr += 2; + } else { + non_rfc2047: + /* stop if we encounter a possible rfc2047 encoded + * token even if it's inside another word, sigh. */ + while (is_atom (*inptr) && strncmp (inptr, "=?", 2) != 0) + inptr++; + } + } else { + while (is_atom (*inptr)) + inptr++; + } + + n = (size_t) (inptr - word); + if ((token = rfc2047_token_new_encoded_word (word, n))) { + /* rfc2047 states that you must ignore all + * whitespace between encoded words */ + if (!encoded && lwsp != NULL) { + tail->next = lwsp; + tail = lwsp; + } else if (lwsp != NULL) { + rfc2047_token_free (lwsp); + } + + tail->next = token; + tail = token; + + encoded = TRUE; + } else { + /* append the lwsp and atom tokens */ + if (lwsp != NULL) { + tail->next = lwsp; + tail = lwsp; + } + + token = rfc2047_token_new (word, n); + token->is_8bit = ascii ? 0 : 1; + tail->next = token; + tail = token; + + encoded = FALSE; + } + } else { + /* append the lwsp token */ + if (lwsp != NULL) { + tail->next = lwsp; + tail = lwsp; + } + + ascii = TRUE; + while (*inptr && !is_lwsp (*inptr) && !is_atom (*inptr)) { + ascii = ascii && is_ascii (*inptr); + inptr++; + } + + n = (size_t) (inptr - word); + token = rfc2047_token_new (word, n); + token->is_8bit = ascii ? 0 : 1; + + tail->next = token; + tail = token; + + encoded = FALSE; + } + } + + *len = (size_t) (inptr - in); + + return list.next; +} + +static rfc2047_token * +tokenize_rfc2047_text (const char *in, size_t *len) +{ + gboolean enable_rfc2047_workarounds = _g_mime_enable_rfc2047_workarounds (); + rfc2047_token list, *lwsp, *token, *tail; + register const char *inptr = in; + gboolean encoded = FALSE; + const char *text, *word; + gboolean ascii; + size_t n; + + tail = (rfc2047_token *) &list; + list.next = NULL; + lwsp = NULL; + + while (*inptr != '\0') { + text = inptr; + while (is_lwsp (*inptr)) + inptr++; + + if (inptr > text) + lwsp = rfc2047_token_new (text, inptr - text); + else + lwsp = NULL; + + if (*inptr != '\0') { + word = inptr; + ascii = TRUE; + + if (G_UNLIKELY (enable_rfc2047_workarounds)) { + if (!strncmp (inptr, "=?", 2)) { + inptr += 2; + + /* skip past the charset (if one is even declared, sigh) */ + while (*inptr && *inptr != '?') { + ascii = ascii && is_ascii (*inptr); + inptr++; + } + + /* sanity check encoding type */ + if (inptr[0] != '?' || !strchr ("BbQq", inptr[1]) || inptr[2] != '?') + goto non_rfc2047; + + inptr += 3; + + /* find the end of the rfc2047 encoded word token */ + while (*inptr && strncmp (inptr, "?=", 2) != 0) { + ascii = ascii && is_ascii (*inptr); + inptr++; + } + + if (*inptr == '\0') { + /* didn't find an end marker... */ + inptr = word + 2; + ascii = TRUE; + + goto non_rfc2047; + } + + inptr += 2; + } else { + non_rfc2047: + /* stop if we encounter a possible rfc2047 encoded + * token even if it's inside another word, sigh. */ + while (*inptr && !is_lwsp (*inptr) && + strncmp (inptr, "=?", 2) != 0) { + ascii = ascii && is_ascii (*inptr); + inptr++; + } + } + } else { + while (*inptr && !is_lwsp (*inptr)) { + ascii = ascii && is_ascii (*inptr); + inptr++; + } + } + + n = (size_t) (inptr - word); + if ((token = rfc2047_token_new_encoded_word (word, n))) { + /* rfc2047 states that you must ignore all + * whitespace between encoded words */ + if (!encoded && lwsp != NULL) { + tail->next = lwsp; + tail = lwsp; + } else if (lwsp != NULL) { + rfc2047_token_free (lwsp); + } + + tail->next = token; + tail = token; + + encoded = TRUE; + } else { + /* append the lwsp and atom tokens */ + if (lwsp != NULL) { + tail->next = lwsp; + tail = lwsp; + } + + token = rfc2047_token_new (word, n); + token->is_8bit = ascii ? 0 : 1; + tail->next = token; + tail = token; + + encoded = FALSE; + } + } else { + if (lwsp != NULL) { + /* appending trailing lwsp */ + tail->next = lwsp; + tail = lwsp; + } + + break; + } + } + + *len = (size_t) (inptr - in); + + return list.next; +} + +static size_t +rfc2047_token_decode (rfc2047_token *token, unsigned char *outbuf, int *state, guint32 *save) +{ + const unsigned char *inbuf = (const unsigned char *) token->text; + size_t len = token->length; + + if (token->encoding == 'B') + return g_mime_encoding_base64_decode_step (inbuf, len, outbuf, state, save); + else + return quoted_decode (inbuf, len, outbuf, state, save); +} + +static char * +rfc2047_decode_tokens (rfc2047_token *tokens, size_t buflen) +{ + rfc2047_token *token, *next; + size_t outlen, ninval, len; + unsigned char *outptr; + const char *charset; + GByteArray *outbuf; + GString *decoded; + char encoding; + guint32 save; + iconv_t cd; + int state; + char *str; + + decoded = g_string_sized_new (buflen + 1); + outbuf = g_byte_array_sized_new (76); + + token = tokens; + while (token != NULL) { + next = token->next; + + if (token->encoding) { + /* In order to work around broken mailers, we need to combine + * the raw decoded content of runs of identically encoded word + * tokens before converting into UTF-8. */ + encoding = token->encoding; + charset = token->charset; + len = token->length; + state = 0; + save = 0; + + /* find the end of the run (and measure the buffer length we'll need) */ + while (next && next->encoding == encoding && !strcmp (next->charset, charset)) { + len += next->length; + next = next->next; + } + + /* make sure our temporary output buffer is large enough... */ + if (len > outbuf->len) + g_byte_array_set_size (outbuf, len); + + /* base64 / quoted-printable decode each of the tokens... */ + outptr = outbuf->data; + outlen = 0; + do { + /* Note: by not resetting state/save each loop, we effectively + * treat the payloads as one continuous block, thus allowing + * us to handle cases where a hex-encoded triplet of a + * quoted-printable encoded payload is split between 2 or more + * encoded-word tokens. */ + len = rfc2047_token_decode (token, outptr, &state, &save); + token = token->next; + outptr += len; + outlen += len; + } while (token != next); + outptr = outbuf->data; + + /* convert the raw decoded text into UTF-8 */ + if (!g_ascii_strcasecmp (charset, "UTF-8")) { + /* slight optimization over going thru iconv */ + str = (char *) outptr; + len = outlen; + + while (!g_utf8_validate (str, len, (const char **) &str)) { + len = outlen - (str - (char *) outptr); + *str = '?'; + } + + g_string_append_len (decoded, (char *) outptr, outlen); + } else if ((cd = g_mime_iconv_open ("UTF-8", charset)) == (iconv_t) -1) { + w(g_warning ("Cannot convert from %s to UTF-8, header display may " + "be corrupt: %s", charset[0] ? charset : "unspecified charset", + g_strerror (errno))); + + str = g_mime_utils_decode_8bit ((char *) outptr, outlen); + g_string_append (decoded, str); + g_free (str); + } else { + str = g_malloc (outlen + 1); + len = outlen; + + len = charset_convert (cd, (char *) outptr, outlen, &str, &len, &ninval); + g_mime_iconv_close (cd); + + g_string_append_len (decoded, str, len); + g_free (str); + +#if w(!)0 + if (ninval > 0) { + g_warning ("Failed to completely convert \"%.*s\" to UTF-8, display may be " + "corrupt: %s", outlen, (char *) outptr, g_strerror (errno)); + } +#endif + } + } else if (token->is_8bit) { + /* *sigh* I hate broken mailers... */ + str = g_mime_utils_decode_8bit (token->text, token->length); + g_string_append (decoded, str); + g_free (str); + } else { + g_string_append_len (decoded, token->text, token->length); + } + + token = next; + } + + g_byte_array_free (outbuf, TRUE); + + return g_string_free (decoded, FALSE); +} + + +/** + * g_mime_utils_header_decode_text: + * @text: header text to decode + * + * Decodes an rfc2047 encoded 'text' header. + * + * Note: See g_mime_set_user_charsets() for details on how charset + * conversion is handled for unencoded 8bit text and/or wrongly + * specified rfc2047 encoded-word tokens. + * + * Returns: a newly allocated UTF-8 string representing the the decoded + * header. + **/ +char * +g_mime_utils_header_decode_text (const char *text) +{ + rfc2047_token *tokens; + char *decoded; + size_t len; + + if (text == NULL) + return g_strdup (""); + + tokens = tokenize_rfc2047_text (text, &len); + decoded = rfc2047_decode_tokens (tokens, len); + rfc2047_token_list_free (tokens); + + return decoded; +} + + +/** + * g_mime_utils_header_decode_phrase: + * @phrase: header to decode + * + * Decodes an rfc2047 encoded 'phrase' header. + * + * Note: See g_mime_set_user_charsets() for details on how charset + * conversion is handled for unencoded 8bit text and/or wrongly + * specified rfc2047 encoded-word tokens. + * + * Returns: a newly allocated UTF-8 string representing the the decoded + * header. + **/ +char * +g_mime_utils_header_decode_phrase (const char *phrase) +{ + rfc2047_token *tokens; + char *decoded; + size_t len; + + if (phrase == NULL) + return g_strdup (""); + + tokens = tokenize_rfc2047_phrase (phrase, &len); + decoded = rfc2047_decode_tokens (tokens, len); + rfc2047_token_list_free (tokens); + + return decoded; +} + + +/* rfc2047 version of quoted-printable */ +static size_t +quoted_encode (const char *in, size_t len, unsigned char *out, gushort safemask) +{ + register const unsigned char *inptr = (const unsigned char *) in; + const unsigned char *inend = inptr + len; + register unsigned char *outptr = out; + unsigned char c; + + while (inptr < inend) { + c = *inptr++; + if (c == ' ') { + *outptr++ = '_'; + } else if (c != '_' && gmime_special_table[c] & safemask) { + *outptr++ = c; + } else { + *outptr++ = '='; + *outptr++ = tohex[(c >> 4) & 0xf]; + *outptr++ = tohex[c & 0xf]; + } + } + + return (outptr - out); +} + +static void +rfc2047_encode_word (GString *string, const char *word, size_t len, + const char *charset, gushort safemask) +{ + register char *inptr, *outptr; + iconv_t cd = (iconv_t) -1; + unsigned char *encoded; + size_t enclen, pos; + char *uword = NULL; + guint32 save = 0; + int state = 0; + char encoding; + + if (g_ascii_strcasecmp (charset, "UTF-8") != 0) + cd = g_mime_iconv_open (charset, "UTF-8"); + + if (cd != (iconv_t) -1) { + uword = g_mime_iconv_strndup (cd, (char *) word, len); + g_mime_iconv_close (cd); + } + + if (uword) { + len = strlen (uword); + word = uword; + } else { + charset = "UTF-8"; + } + + switch (g_mime_utils_best_encoding ((const unsigned char *) word, len)) { + case GMIME_CONTENT_ENCODING_BASE64: + enclen = GMIME_BASE64_ENCODE_LEN (len); + encoded = g_alloca (enclen + 1); + + encoding = 'b'; + + pos = g_mime_encoding_base64_encode_close ((const unsigned char *) word, len, encoded, &state, &save); + encoded[pos] = '\0'; + + /* remove \n chars as headers need to be wrapped differently */ + if (G_UNLIKELY ((inptr = strchr ((char *) encoded, '\n')))) { + outptr = inptr++; + while (G_LIKELY (*inptr)) { + if (G_LIKELY (*inptr != '\n')) + *outptr++ = *inptr; + + inptr++; + } + + *outptr = '\0'; + } + + break; + case GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE: + enclen = GMIME_QP_ENCODE_LEN (len); + encoded = g_alloca (enclen + 1); + + encoding = 'q'; + + pos = quoted_encode (word, len, encoded, safemask); + encoded[pos] = '\0'; + + break; + default: + encoded = NULL; + encoding = '\0'; + g_assert_not_reached (); + } + + g_free (uword); + + g_string_append_printf (string, "=?%s?%c?%s?=", charset, encoding, encoded); +} + + +typedef enum { + WORD_ATOM, + WORD_QSTRING, + WORD_2047 +} rfc822_word_t; + +typedef struct _rfc822_word { + struct _rfc822_word *next; + const char *start, *end; + rfc822_word_t type; + int encoding; +} rfc822_word; + +#define rfc822_word_free(word) g_slice_free (rfc822_word, word) +#define rfc822_word_new() g_slice_new (rfc822_word) + +/* okay, so 'unstructured text' fields don't actually contain 'word' + * tokens, but we can group stuff similarly... */ +static rfc822_word * +rfc2047_encode_get_rfc822_words (const char *in, gboolean phrase) +{ + rfc822_word words, *tail, *word; + rfc822_word_t type = WORD_ATOM; + const char *inptr, *start, *last; + int count = 0, encoding = 0; + + tail = (rfc822_word *) &words; + words.next = NULL; + + last = start = inptr = in; + while (inptr && *inptr) { + const char *newinptr; + gunichar c; + + newinptr = g_utf8_next_char (inptr); + c = g_utf8_get_char (inptr); + if (newinptr == NULL || !g_unichar_validate (c)) { + w(g_warning ("Invalid UTF-8 sequence encountered")); + inptr++; + continue; + } + + inptr = newinptr; + + if (c < 256 && is_blank (c)) { + if (count > 0) { + word = rfc822_word_new (); + word->next = NULL; + word->start = start; + word->end = last; + word->type = type; + word->encoding = encoding; + + tail->next = word; + tail = word; + count = 0; + } + + start = inptr; + type = WORD_ATOM; + encoding = 0; + } else { + count++; + if (c < 128) { + if (is_ctrl (c)) { + type = WORD_2047; + encoding = MAX (encoding, 1); + } else if (phrase && !is_atom (c)) { + /* phrases can have qstring words */ + type = MAX (type, WORD_QSTRING); + } + } else if (c < 256) { + type = WORD_2047; + encoding = MAX (encoding, 1); + } else { + type = WORD_2047; + encoding = 2; + } + + if (count >= GMIME_FOLD_PREENCODED) { + if (type == WORD_ATOM) + type = WORD_2047; + + word = rfc822_word_new (); + word->next = NULL; + word->start = start; + word->end = inptr; + word->type = type; + word->encoding = encoding; + + tail->next = word; + tail = word; + count = 0; + + /* Note: don't reset 'type' as it + * needs to be preserved when breaking + * long words */ + start = inptr; + encoding = 0; + } + } + + last = inptr; + } + + if (count > 0) { + word = rfc822_word_new (); + word->next = NULL; + word->start = start; + word->end = last; + word->type = type; + word->encoding = encoding; + + tail->next = word; + tail = word; + } + +#if d(!)0 + printf ("rfc822 word tokens:\n"); + word = words.next; + while (word) { + printf ("\t'%.*s'; type=%d, encoding=%d\n", + word->end - word->start, word->start, + word->type, word->encoding); + + word = word->next; + } +#endif + + return words.next; +} + +#define MERGED_WORD_LT_FOLDLEN(wlen, type) ((type) == WORD_2047 ? (wlen) < GMIME_FOLD_PREENCODED : (wlen) < (GMIME_FOLD_LEN - 8)) + +static gboolean +should_merge_words (rfc822_word *word, rfc822_word *next) +{ + switch (word->type) { + case WORD_ATOM: + if (next->type == WORD_2047) + return FALSE; + + return (MERGED_WORD_LT_FOLDLEN (next->end - word->start, next->type)); + case WORD_QSTRING: + /* avoid merging with words that need to be rfc2047 encoded */ + if (next->type == WORD_2047) + return FALSE; + + return (MERGED_WORD_LT_FOLDLEN (next->end - word->start, WORD_QSTRING)); + case WORD_2047: + if (next->type == WORD_ATOM) { + /* whether we merge or not is dependent upon: + * 1. the number of atoms in a row after 'word' + * 2. if there is another encword after the string of atoms. + */ + int natoms = 0; + + while (next && next->type == WORD_ATOM) { + next = next->next; + natoms++; + } + + /* if all the words after the encword are atoms, don't merge */ + if (!next || natoms > 3) + return FALSE; + } + + /* avoid merging with qstrings */ + if (next->type == WORD_QSTRING) + return FALSE; + + return (MERGED_WORD_LT_FOLDLEN (next->end - word->start, WORD_2047)); + default: + return FALSE; + } +} + +static void +rfc2047_encode_merge_rfc822_words (rfc822_word **wordsp) +{ + rfc822_word *word, *next, *words = *wordsp; + + /* first pass: merge qstrings with adjacent qstrings and encwords with adjacent encwords */ + word = words; + while (word && word->next) { + next = word->next; + + if (word->type != WORD_ATOM && word->type == next->type && + MERGED_WORD_LT_FOLDLEN (next->end - word->start, word->type)) { + /* merge the words */ + word->encoding = MAX (word->encoding, next->encoding); + + word->end = next->end; + word->next = next->next; + + rfc822_word_free (next); + + next = word; + } + + word = next; + } + + /* second pass: now merge atoms with the other words */ + word = words; + while (word && word->next) { + next = word->next; + + if (should_merge_words (word, next)) { + /* the resulting word type is the MAX of the 2 types */ + word->type = MAX (word->type, next->type); + + word->encoding = MAX (word->encoding, next->encoding); + + word->end = next->end; + word->next = next->next; + + rfc822_word_free (next); + + continue; + } + + word = next; + } + + *wordsp = words; +} + +static void +g_string_append_len_quoted (GString *out, const char *in, size_t len) +{ + register const char *inptr; + const char *inend; + + g_string_append_c (out, '"'); + + inptr = in; + inend = in + len; + + while (inptr < inend) { + if (*inptr == '"' || *inptr == '\\') + g_string_append_c (out, '\\'); + + g_string_append_c (out, *inptr); + + inptr++; + } + + g_string_append_c (out, '"'); +} + +static char * +rfc2047_encode (const char *in, gushort safemask) +{ + rfc822_word *words, *word, *prev = NULL; + const char **charsets, *charset; + const char *start; + GMimeCharset mask; + GString *out; + char *outstr; + size_t len; + int i; + + if (!(words = rfc2047_encode_get_rfc822_words (in, safemask & IS_PSAFE))) + return g_strdup (in); + + rfc2047_encode_merge_rfc822_words (&words); + + charsets = g_mime_user_charsets (); + + out = g_string_new (""); + + /* output words now with spaces between them */ + word = words; + while (word) { + /* append correct number of spaces between words */ + if (prev && !(prev->type == WORD_2047 && word->type == WORD_2047)) { + /* one or both of the words are not encoded so we write the spaces out untouched */ + len = word->start - prev->end; + g_string_append_len (out, prev->end, len); + } + + switch (word->type) { + case WORD_ATOM: + g_string_append_len (out, word->start, (size_t) (word->end - word->start)); + break; + case WORD_QSTRING: + g_assert (safemask & IS_PSAFE); + g_string_append_len_quoted (out, word->start, (size_t) (word->end - word->start)); + break; + case WORD_2047: + if (prev && prev->type == WORD_2047) { + /* include the whitespace chars between these 2 words in the + resulting rfc2047 encoded word. */ + len = word->end - prev->end; + start = prev->end; + + /* encoded words need to be separated by linear whitespace */ + g_string_append_c (out, ' '); + } else { + len = word->end - word->start; + start = word->start; + } + + switch (word->encoding) { + case 0: /* us-ascii */ + rfc2047_encode_word (out, start, len, "us-ascii", safemask); + break; + case 1: /* iso-8859-1 */ + rfc2047_encode_word (out, start, len, "iso-8859-1", safemask); + break; + default: + charset = NULL; + g_mime_charset_init (&mask); + g_mime_charset_step (&mask, start, len); + + for (i = 0; charsets && charsets[i]; i++) { + if (g_mime_charset_can_encode (&mask, charsets[i], start, len)) { + charset = charsets[i]; + break; + } + } + + if (!charset) + charset = g_mime_charset_best_name (&mask); + + rfc2047_encode_word (out, start, len, charset, safemask); + break; + } + + break; + } + + rfc822_word_free (prev); + + prev = word; + word = word->next; + } + + rfc822_word_free (prev); + + outstr = out->str; + g_string_free (out, FALSE); + + return outstr; +} + + +/** + * g_mime_utils_header_encode_phrase: + * @phrase: phrase to encode + * + * Encodes a 'phrase' header according to the rules in rfc2047. + * + * Returns: the encoded 'phrase'. Useful for encoding internet + * addresses. + **/ +char * +g_mime_utils_header_encode_phrase (const char *phrase) +{ + if (phrase == NULL) + return NULL; + + return rfc2047_encode (phrase, IS_PSAFE); +} + + +/** + * g_mime_utils_header_encode_text: + * @text: text to encode + * + * Encodes a 'text' header according to the rules in rfc2047. + * + * Returns: the encoded header. Useful for encoding + * headers like "Subject". + **/ +char * +g_mime_utils_header_encode_text (const char *text) +{ + if (text == NULL) + return NULL; + + return rfc2047_encode (text, IS_ESAFE); +} diff --git a/gmime/gmime-utils.h b/gmime/gmime-utils.h new file mode 100644 index 0000000..bd6d78b --- /dev/null +++ b/gmime/gmime-utils.h @@ -0,0 +1,89 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_UTILS_H__ +#define __GMIME_UTILS_H__ + +#include +#include +#include + +#include + +G_BEGIN_DECLS + +typedef struct _GMimeReferences GMimeReferences; + +/** + * GMimeReferences: + * @next: Pointer to the next reference. + * @msgid: Reference message-id. + * + * A List of references, as per the References or In-Reply-To header + * fields. + **/ +struct _GMimeReferences { + GMimeReferences *next; + char *msgid; +}; + + +time_t g_mime_utils_header_decode_date (const char *str, int *tz_offset); +char *g_mime_utils_header_format_date (time_t date, int tz_offset); + +char *g_mime_utils_generate_message_id (const char *fqdn); + +/* decode a message-id */ +char *g_mime_utils_decode_message_id (const char *message_id); + +/* decode a References or In-Reply-To header */ +GMimeReferences *g_mime_references_decode (const char *text); +void g_mime_references_append (GMimeReferences **refs, const char *msgid); +void g_mime_references_clear (GMimeReferences **refs); +void g_mime_references_free (GMimeReferences *refs); +const GMimeReferences *g_mime_references_get_next (const GMimeReferences *ref); +const char *g_mime_references_get_message_id (const GMimeReferences *ref); + +char *g_mime_utils_structured_header_fold (const char *str); +char *g_mime_utils_unstructured_header_fold (const char *str); +char *g_mime_utils_header_fold (const char *str); +char *g_mime_utils_header_printf (const char *format, ...); + +char *g_mime_utils_quote_string (const char *str); +void g_mime_utils_unquote_string (char *str); + +/* encoding decision making utilities ;-) */ +gboolean g_mime_utils_text_is_8bit (const unsigned char *text, size_t len); +GMimeContentEncoding g_mime_utils_best_encoding (const unsigned char *text, size_t len); + +/* utility function to convert text in an unknown 8bit/multibyte charset to UTF-8 */ +char *g_mime_utils_decode_8bit (const char *text, size_t len); + +/* utilities to (de/en)code headers */ +char *g_mime_utils_header_decode_text (const char *text); +char *g_mime_utils_header_encode_text (const char *text); + +char *g_mime_utils_header_decode_phrase (const char *phrase); +char *g_mime_utils_header_encode_phrase (const char *phrase); + +G_END_DECLS + +#endif /* __GMIME_UTILS_H__ */ diff --git a/gmime/gmime-version.h b/gmime/gmime-version.h new file mode 100644 index 0000000..e6be09c --- /dev/null +++ b/gmime/gmime-version.h @@ -0,0 +1,76 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_VERSION_H__ +#define __GMIME_VERSION_H__ + +/** + * GMIME_MAJOR_VERSION: + * + * GMime's major version. + **/ +#define GMIME_MAJOR_VERSION (2) + +/** + * GMIME_MINOR_VERSION: + * + * GMime's minor version. + **/ +#define GMIME_MINOR_VERSION (6) + +/** + * GMIME_MICRO_VERSION: + * + * GMime's micro version. + **/ +#define GMIME_MICRO_VERSION (15) + +/** + * GMIME_BINARY_AGE: + * + * GMime's binary age. + **/ +#define GMIME_BINARY_AGE (615) + +/** + * GMIME_INTERFACE_AGE: + * + * GMime's interface age. + **/ +#define GMIME_INTERFACE_AGE (15) + + +/** + * GMIME_CHECK_VERSION: + * @major: Minimum major version + * @minor: Minimum minor version + * @micro: Minimum micro version + * + * Check whether a GMime version equal to or greater than + * @major.@minor.@micro is present. + **/ +#define GMIME_CHECK_VERSION(major,minor,micro) \ + (GMIME_MAJOR_VERSION > (major) || \ + (GMIME_MAJOR_VERSION == (major) && GMIME_MINOR_VERSION > (minor)) || \ + (GMIME_MAJOR_VERSION == (major) && GMIME_MINOR_VERSION == (minor) && \ + GMIME_MICRO_VERSION >= (micro))) + +#endif /* __GMIME_VERSION_H__ */ diff --git a/gmime/gmime-version.h.in b/gmime/gmime-version.h.in new file mode 100644 index 0000000..5c5a785 --- /dev/null +++ b/gmime/gmime-version.h.in @@ -0,0 +1,76 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_VERSION_H__ +#define __GMIME_VERSION_H__ + +/** + * GMIME_MAJOR_VERSION: + * + * GMime's major version. + **/ +#define GMIME_MAJOR_VERSION (@GMIME_MAJOR_VERSION@) + +/** + * GMIME_MINOR_VERSION: + * + * GMime's minor version. + **/ +#define GMIME_MINOR_VERSION (@GMIME_MINOR_VERSION@) + +/** + * GMIME_MICRO_VERSION: + * + * GMime's micro version. + **/ +#define GMIME_MICRO_VERSION (@GMIME_MICRO_VERSION@) + +/** + * GMIME_BINARY_AGE: + * + * GMime's binary age. + **/ +#define GMIME_BINARY_AGE (@GMIME_BINARY_AGE@) + +/** + * GMIME_INTERFACE_AGE: + * + * GMime's interface age. + **/ +#define GMIME_INTERFACE_AGE (@GMIME_INTERFACE_AGE@) + + +/** + * GMIME_CHECK_VERSION: + * @major: Minimum major version + * @minor: Minimum minor version + * @micro: Minimum micro version + * + * Check whether a GMime version equal to or greater than + * @major.@minor.@micro is present. + **/ +#define GMIME_CHECK_VERSION(major,minor,micro) \ + (GMIME_MAJOR_VERSION > (major) || \ + (GMIME_MAJOR_VERSION == (major) && GMIME_MINOR_VERSION > (minor)) || \ + (GMIME_MAJOR_VERSION == (major) && GMIME_MINOR_VERSION == (minor) && \ + GMIME_MICRO_VERSION >= (micro))) + +#endif /* __GMIME_VERSION_H__ */ diff --git a/gmime/gmime.c b/gmime/gmime.c new file mode 100644 index 0000000..bc87304 --- /dev/null +++ b/gmime/gmime.c @@ -0,0 +1,211 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#ifdef ENABLE_SMIME +#include +#endif + +#include "gmime.h" + +#ifdef ENABLE_CRYPTOGRAPHY +#include "gmime-pkcs7-context.h" +#include "gmime-gpg-context.h" +#endif + + +/** + * SECTION: gmime + * @title: gmime + * @short_description: Initialization, shutdown and version-check routines + * @see_also: + * + * Initialization, shutdown, and version-check functions. + **/ + +extern gboolean _g_mime_enable_rfc2047_workarounds (void); + +GQuark gmime_gpgme_error_quark; +GQuark gmime_error_quark; + +const guint gmime_major_version = GMIME_MAJOR_VERSION; +const guint gmime_minor_version = GMIME_MINOR_VERSION; +const guint gmime_micro_version = GMIME_MICRO_VERSION; +const guint gmime_interface_age = GMIME_INTERFACE_AGE; +const guint gmime_binary_age = GMIME_BINARY_AGE; + +static unsigned int initialized = 0; +static guint32 enable = 0; + + +/** + * g_mime_check_version: + * @major: Minimum major version + * @minor: Minimum minor version + * @micro: Minimum micro version + * + * Checks that the GMime library version meets the requirements of the + * required version. + * + * Returns: %TRUE if the requirement is met or %FALSE otherwise. + **/ +gboolean +g_mime_check_version (guint major, guint minor, guint micro) +{ + if (GMIME_MAJOR_VERSION > major) + return TRUE; + + if (GMIME_MAJOR_VERSION == major && GMIME_MINOR_VERSION > minor) + return TRUE; + + if (GMIME_MAJOR_VERSION == major && GMIME_MINOR_VERSION == minor && GMIME_MICRO_VERSION >= micro) + return TRUE; + + return FALSE; +} + + +/** + * g_mime_init: + * @flags: initialization flags + * + * Initializes GMime. + * + * Note: Calls g_mime_charset_map_init() and g_mime_iconv_init() as + * well. + **/ +void +g_mime_init (guint32 flags) +{ + if (initialized++) + return; + +#if defined (HAVE_TIMEZONE) || defined (HAVE__TIMEZONE) + /* initialize timezone */ + tzset (); +#endif + + enable = flags; + + g_type_init (); + + g_mime_charset_map_init (); + + g_mime_iconv_init (); + +#ifdef ENABLE_SMIME + /* gpgme_check_version() initializes GpgMe */ + gpgme_check_version (NULL); +#endif /* ENABLE_SMIME */ + + gmime_gpgme_error_quark = g_quark_from_static_string ("gmime-gpgme"); + gmime_error_quark = g_quark_from_static_string ("gmime"); + + /* register our GObject types with the GType system */ + g_mime_crypto_context_get_type (); + g_mime_decrypt_result_get_type (); + g_mime_certificate_list_get_type (); + g_mime_signature_list_get_type (); + g_mime_certificate_get_type (); + g_mime_signature_get_type (); +#ifdef ENABLE_CRYPTOGRAPHY + g_mime_gpg_context_get_type (); + g_mime_pkcs7_context_get_type (); +#endif + + g_mime_filter_get_type (); + g_mime_filter_basic_get_type (); + g_mime_filter_best_get_type (); + g_mime_filter_charset_get_type (); + g_mime_filter_crlf_get_type (); + g_mime_filter_enriched_get_type (); + g_mime_filter_from_get_type (); + g_mime_filter_gzip_get_type (); + g_mime_filter_html_get_type (); + g_mime_filter_md5_get_type (); + g_mime_filter_strip_get_type (); + g_mime_filter_windows_get_type (); + g_mime_filter_yenc_get_type (); + + g_mime_stream_get_type (); + g_mime_stream_buffer_get_type (); + g_mime_stream_cat_get_type (); + g_mime_stream_file_get_type (); + g_mime_stream_filter_get_type (); + g_mime_stream_fs_get_type (); + g_mime_stream_gio_get_type (); + g_mime_stream_mem_get_type (); + g_mime_stream_mmap_get_type (); + g_mime_stream_null_get_type (); + g_mime_stream_pipe_get_type (); + + g_mime_parser_get_type (); + g_mime_message_get_type (); + g_mime_data_wrapper_get_type (); + g_mime_content_type_get_type (); + g_mime_content_disposition_get_type (); + + internet_address_get_type (); + internet_address_list_get_type (); + internet_address_group_get_type (); + internet_address_mailbox_get_type (); + + /* register our default mime object types */ + g_mime_object_type_registry_init (); + g_mime_object_register_type ("*", "*", g_mime_part_get_type ()); + g_mime_object_register_type ("multipart", "*", g_mime_multipart_get_type ()); + g_mime_object_register_type ("multipart", "encrypted", g_mime_multipart_encrypted_get_type ()); + g_mime_object_register_type ("multipart", "signed", g_mime_multipart_signed_get_type ()); + g_mime_object_register_type ("message", "rfc822", g_mime_message_part_get_type ()); + g_mime_object_register_type ("message", "rfc2822", g_mime_message_part_get_type ()); + g_mime_object_register_type ("message", "news", g_mime_message_part_get_type ()); + g_mime_object_register_type ("message", "partial", g_mime_message_partial_get_type ()); +} + + +/** + * g_mime_shutdown: + * + * Frees internally allocated tables created in g_mime_init(). Also + * calls g_mime_charset_map_shutdown() and g_mime_iconv_shutdown(). + **/ +void +g_mime_shutdown (void) +{ + if (--initialized) + return; + + g_mime_object_type_registry_shutdown (); + g_mime_charset_map_shutdown (); + g_mime_iconv_shutdown (); +} + + +gboolean +_g_mime_enable_rfc2047_workarounds (void) +{ + return (enable & GMIME_ENABLE_RFC2047_WORKAROUNDS); +} diff --git a/gmime/gmime.h b/gmime/gmime.h new file mode 100644 index 0000000..6b97b6e --- /dev/null +++ b/gmime/gmime.h @@ -0,0 +1,131 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __GMIME_H__ +#define __GMIME_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +/* GMIME version */ + +/** + * gmime_major_version: + * + * GMime's major version. + **/ +extern const guint gmime_major_version; + +/** + * gmime_minor_version: + * + * GMime's minor version. + **/ +extern const guint gmime_minor_version; + +/** + * gmime_micro_version: + * + * GMime's micro version. + **/ +extern const guint gmime_micro_version; + +/** + * gmime_interface_age: + * + * GMime's interface age. + **/ +extern const guint gmime_interface_age; + +/** + * gmime_binary_age: + * + * GMime's binary age. + **/ +extern const guint gmime_binary_age; + +gboolean g_mime_check_version (guint major, guint minor, guint micro); + + +/** + * GMIME_ENABLE_RFC2047_WORKAROUNDS: + * + * Initialization flag to enable workarounds for badly formed rfc2047 + * encoded-words. + **/ +#define GMIME_ENABLE_RFC2047_WORKAROUNDS (1 << 0) + +void g_mime_init (guint32 flags); +void g_mime_shutdown (void); + +G_END_DECLS + +#endif /* __GMIME_H__ */ diff --git a/gmime/internet-address.c b/gmime/internet-address.c new file mode 100644 index 0000000..d1b92de --- /dev/null +++ b/gmime/internet-address.c @@ -0,0 +1,1590 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include "internet-address.h" +#include "gmime-table-private.h" +#include "gmime-parse-utils.h" +#include "gmime-iconv-utils.h" +#include "gmime-events.h" +#include "gmime-utils.h" +#include "list.h" + + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + +#define d(x) + + +/** + * SECTION: internet-address + * @title: InternetAddress + * @short_description: Internet addresses + * @see_also: #InternetAddressGroup, #InternetAddressMailbox + * + * An #InternetAddress is the base class for #InternetAddressGroup and + * #InternetAddressMailbox. + **/ + +/** + * SECTION: internet-address-group + * @title: InternetAddressGroup + * @short_description: rfc822 'group' address + * @see_also: #InternetAddress + * + * An #InternetAddressGroup represents an rfc822 'group' address. + **/ + +/** + * SECTION: internet-address-mailbox + * @title: InternetAddressMailbox + * @short_description: rfc822 'mailbox' address + * @see_also: #InternetAddress + * + * An #InternetAddressMailbox represents what is a typical "email + * address". + **/ + +/** + * SECTION: internet-address-list + * @title: InternetAddressList + * @short_description: A list of internet addresses + * @see_also: #InternetAddress + * + * An #InternetAddressList is a collection of #InternetAddress + * objects. + **/ + + +enum { + INTERNET_ADDRESS_ENCODE = 1 << 0, + INTERNET_ADDRESS_FOLD = 1 << 1, +}; + + +static void internet_address_class_init (InternetAddressClass *klass); +static void internet_address_init (InternetAddress *ia, InternetAddressClass *klass); +static void internet_address_finalize (GObject *object); + + +static GObjectClass *parent_class = NULL; + + +GType +internet_address_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (InternetAddressClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) internet_address_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (InternetAddress), + 0, /* n_preallocs */ + (GInstanceInitFunc) internet_address_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "InternetAddress", + &info, G_TYPE_FLAG_ABSTRACT); + } + + return type; +} + + +static void +internet_address_class_init (InternetAddressClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = internet_address_finalize; + + klass->to_string = NULL; +} + +static void +internet_address_init (InternetAddress *ia, InternetAddressClass *klass) +{ + ia->priv = g_mime_event_new ((GObject *) ia); + ia->name = NULL; +} + +static void +internet_address_finalize (GObject *object) +{ + InternetAddress *ia = (InternetAddress *) object; + + g_mime_event_destroy (ia->priv); + g_free (ia->name); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static void +_internet_address_set_name (InternetAddress *ia, const char *name) +{ + char *buf; + + buf = g_strdup (name); + g_free (ia->name); + ia->name = buf; +} + +/** + * internet_address_set_name: + * @ia: a #InternetAddress + * @name: the display name for the address group or mailbox + * + * Set the display name of the #InternetAddress. + **/ +void +internet_address_set_name (InternetAddress *ia, const char *name) +{ + g_return_if_fail (IS_INTERNET_ADDRESS (ia)); + + _internet_address_set_name (ia, name); + + g_mime_event_emit (ia->priv, NULL); +} + + +/** + * internet_address_get_name: + * @ia: a #InternetAddress + * + * Gets the display name of the #InternetAddress. + * + * Returns: the display name of @ia. + **/ +const char * +internet_address_get_name (InternetAddress *ia) +{ + g_return_val_if_fail (IS_INTERNET_ADDRESS (ia), NULL); + + return ia->name; +} + + +/** + * internet_address_to_string: + * @ia: Internet Address object + * @encode: %TRUE if the address should be rfc2047 encoded + * + * Allocates a string containing the contents of the #InternetAddress + * object. + * + * Returns: the #InternetAddress object as an allocated string in + * rfc822 format. + **/ +char * +internet_address_to_string (InternetAddress *ia, gboolean encode) +{ + guint32 flags = encode ? INTERNET_ADDRESS_ENCODE : 0; + size_t linelen = 0; + GString *string; + char *str; + + string = g_string_new (""); + INTERNET_ADDRESS_GET_CLASS (ia)->to_string (ia, flags, &linelen, string); + str = string->str; + + g_string_free (string, FALSE); + + return str; +} + + +static void internet_address_mailbox_class_init (InternetAddressMailboxClass *klass); +static void internet_address_mailbox_init (InternetAddressMailbox *mailbox, InternetAddressMailboxClass *klass); +static void internet_address_mailbox_finalize (GObject *object); + +static void mailbox_to_string (InternetAddress *ia, guint32 flags, size_t *linelen, GString *out); + + +static GObjectClass *mailbox_parent_class = NULL; + + +GType +internet_address_mailbox_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (InternetAddressMailboxClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) internet_address_mailbox_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (InternetAddressMailbox), + 0, /* n_preallocs */ + (GInstanceInitFunc) internet_address_mailbox_init, + }; + + type = g_type_register_static (INTERNET_ADDRESS_TYPE, "InternetAddressMailbox", &info, 0); + } + + return type; +} + + +static void +internet_address_mailbox_class_init (InternetAddressMailboxClass *klass) +{ + InternetAddressClass *address_class = INTERNET_ADDRESS_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + mailbox_parent_class = g_type_class_ref (INTERNET_ADDRESS_TYPE); + + object_class->finalize = internet_address_mailbox_finalize; + + address_class->to_string = mailbox_to_string; +} + +static void +internet_address_mailbox_init (InternetAddressMailbox *mailbox, InternetAddressMailboxClass *klass) +{ + mailbox->addr = NULL; +} + +static void +internet_address_mailbox_finalize (GObject *object) +{ + InternetAddressMailbox *mailbox = (InternetAddressMailbox *) object; + + g_free (mailbox->addr); + + G_OBJECT_CLASS (mailbox_parent_class)->finalize (object); +} + + +/** + * internet_address_mailbox_new: + * @name: person's name + * @addr: person's address + * + * Creates a new #InternetAddress object with name @name and address + * @addr. + * + * Returns: a new #InternetAddressMailbox object. + **/ +InternetAddress * +internet_address_mailbox_new (const char *name, const char *addr) +{ + InternetAddressMailbox *mailbox; + + g_return_val_if_fail (addr != NULL, NULL); + + mailbox = g_object_newv (INTERNET_ADDRESS_TYPE_MAILBOX, 0, NULL); + mailbox->addr = g_strdup (addr); + + _internet_address_set_name ((InternetAddress *) mailbox, name); + + return (InternetAddress *) mailbox; +} + + +/** + * internet_address_mailbox_set_addr: + * @mailbox: a #InternetAddressMailbox + * @addr: contact's email address + * + * Set the mailbox address. + **/ +void +internet_address_mailbox_set_addr (InternetAddressMailbox *mailbox, const char *addr) +{ + g_return_if_fail (INTERNET_ADDRESS_IS_MAILBOX (mailbox)); + + if (mailbox->addr == addr) + return; + + g_free (mailbox->addr); + mailbox->addr = g_strdup (addr); + + g_mime_event_emit (((InternetAddress *) mailbox)->priv, NULL); +} + + +/** + * internet_address_mailbox_get_addr: + * @mailbox: a #InternetAddressMailbox + * + * Gets the addr-spec of the internet address mailbox. + * + * Returns: the address of the mailbox. + **/ +const char * +internet_address_mailbox_get_addr (InternetAddressMailbox *mailbox) +{ + g_return_val_if_fail (INTERNET_ADDRESS_IS_MAILBOX (mailbox), NULL); + + return mailbox->addr; +} + + +static void internet_address_group_class_init (InternetAddressGroupClass *klass); +static void internet_address_group_init (InternetAddressGroup *group, InternetAddressGroupClass *klass); +static void internet_address_group_finalize (GObject *object); + +static void group_to_string (InternetAddress *ia, guint32 flags, size_t *linelen, GString *out); + + +static GObjectClass *group_parent_class = NULL; + + +GType +internet_address_group_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (InternetAddressGroupClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) internet_address_group_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (InternetAddressGroup), + 0, /* n_preallocs */ + (GInstanceInitFunc) internet_address_group_init, + }; + + type = g_type_register_static (INTERNET_ADDRESS_TYPE, "InternetAddressGroup", &info, 0); + } + + return type; +} + + +static void +internet_address_group_class_init (InternetAddressGroupClass *klass) +{ + InternetAddressClass *address_class = INTERNET_ADDRESS_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + group_parent_class = g_type_class_ref (INTERNET_ADDRESS_TYPE); + + object_class->finalize = internet_address_group_finalize; + + address_class->to_string = group_to_string; +} + +static void +members_changed (InternetAddressList *members, gpointer args, InternetAddress *group) +{ + g_mime_event_emit (((InternetAddress *) group)->priv, NULL); +} + +static void +internet_address_group_init (InternetAddressGroup *group, InternetAddressGroupClass *klass) +{ + group->members = internet_address_list_new (); + + g_mime_event_add (group->members->priv, (GMimeEventCallback) members_changed, group); +} + +static void +internet_address_group_finalize (GObject *object) +{ + InternetAddressGroup *group = (InternetAddressGroup *) object; + + g_mime_event_remove (group->members->priv, (GMimeEventCallback) members_changed, group); + + g_object_unref (group->members); + + G_OBJECT_CLASS (group_parent_class)->finalize (object); +} + + +/** + * internet_address_group_new: + * @name: group name + * + * Creates a new #InternetAddressGroup object with a display name of + * @name. + * + * Returns: a new #InternetAddressGroup object. + **/ +InternetAddress * +internet_address_group_new (const char *name) +{ + InternetAddress *group; + + group = g_object_newv (INTERNET_ADDRESS_TYPE_GROUP, 0, NULL); + _internet_address_set_name (group, name); + + return group; +} + + +/** + * internet_address_group_set_members: + * @group: a #InternetAddressGroup + * @members: a #InternetAddressList + * + * Set the members of the internet address group. + **/ +void +internet_address_group_set_members (InternetAddressGroup *group, InternetAddressList *members) +{ + g_return_if_fail (INTERNET_ADDRESS_IS_GROUP (group)); + g_return_if_fail (IS_INTERNET_ADDRESS_LIST (members)); + + if (group->members == members) + return; + + if (group->members) { + g_mime_event_remove (group->members->priv, (GMimeEventCallback) members_changed, group); + g_object_unref (group->members); + } + + if (members) { + g_mime_event_add (members->priv, (GMimeEventCallback) members_changed, group); + g_object_ref (members); + } + + group->members = members; + + g_mime_event_emit (((InternetAddress *) group)->priv, NULL); +} + + +/** + * internet_address_group_get_members: + * @group: a #InternetAddressGroup + * + * Gets the #InternetAddressList containing the group members of an + * rfc822 group address. + * + * Returns: a #InternetAddressList containing the members of @group. + **/ +InternetAddressList * +internet_address_group_get_members (InternetAddressGroup *group) +{ + g_return_val_if_fail (INTERNET_ADDRESS_IS_GROUP (group), NULL); + + return group->members; +} + + +#define _internet_address_group_add_member(group,member) _internet_address_list_add (group->members, member) + +/** + * internet_address_group_add_member: + * @group: a #InternetAddressGroup + * @member: a #InternetAddress + * + * Add a contact to the internet address group. + * + * Returns: the index of the newly added member. + **/ +int +internet_address_group_add_member (InternetAddressGroup *group, InternetAddress *member) +{ + g_return_val_if_fail (INTERNET_ADDRESS_IS_GROUP (group), -1); + g_return_val_if_fail (IS_INTERNET_ADDRESS (member), -1); + + return internet_address_list_add (group->members, member); +} + + +static void internet_address_list_class_init (InternetAddressListClass *klass); +static void internet_address_list_init (InternetAddressList *list, InternetAddressListClass *klass); +static void internet_address_list_finalize (GObject *object); + + +static GObjectClass *list_parent_class = NULL; + + +GType +internet_address_list_get_type (void) +{ + static GType type = 0; + + if (!type) { + static const GTypeInfo info = { + sizeof (InternetAddressListClass), + NULL, /* base_class_init */ + NULL, /* base_class_finalize */ + (GClassInitFunc) internet_address_list_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (InternetAddressList), + 0, /* n_preallocs */ + (GInstanceInitFunc) internet_address_list_init, + }; + + type = g_type_register_static (G_TYPE_OBJECT, "InternetAddressList", &info, 0); + } + + return type; +} + + +static void +internet_address_list_class_init (InternetAddressListClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + list_parent_class = g_type_class_ref (G_TYPE_OBJECT); + + object_class->finalize = internet_address_list_finalize; +} + +static void +internet_address_list_init (InternetAddressList *list, InternetAddressListClass *klass) +{ + list->priv = g_mime_event_new ((GObject *) list); + list->array = g_ptr_array_new (); +} + +static void +address_changed (InternetAddress *ia, gpointer args, InternetAddressList *list) +{ + g_mime_event_emit (list->priv, NULL); +} + +static void +internet_address_list_finalize (GObject *object) +{ + InternetAddressList *list = (InternetAddressList *) object; + InternetAddress *ia; + guint i; + + for (i = 0; i < list->array->len; i++) { + ia = (InternetAddress *) list->array->pdata[i]; + g_mime_event_remove (ia->priv, (GMimeEventCallback) address_changed, list); + g_object_unref (ia); + } + + g_mime_event_destroy (list->priv); + + g_ptr_array_free (list->array, TRUE); + + G_OBJECT_CLASS (list_parent_class)->finalize (object); +} + + +/** + * internet_address_list_new: + * + * Creates a new #InternetAddressList. + * + * Returns: a new #InternetAddressList. + **/ +InternetAddressList * +internet_address_list_new (void) +{ + return g_object_newv (INTERNET_ADDRESS_LIST_TYPE, 0, NULL); +} + + +/** + * internet_address_list_length: + * @list: a #InternetAddressList + * + * Gets the length of the list. + * + * Returns: the number of #InternetAddress objects in the list. + **/ +int +internet_address_list_length (InternetAddressList *list) +{ + g_return_val_if_fail (IS_INTERNET_ADDRESS_LIST (list), -1); + + return list->array->len; +} + + +/** + * internet_address_list_clear: + * @list: a #InternetAddressList + * + * Clears the list of addresses. + **/ +void +internet_address_list_clear (InternetAddressList *list) +{ + InternetAddress *ia; + guint i; + + g_return_if_fail (IS_INTERNET_ADDRESS_LIST (list)); + + for (i = 0; i < list->array->len; i++) { + ia = (InternetAddress *) list->array->pdata[i]; + g_mime_event_remove (ia->priv, (GMimeEventCallback) address_changed, list); + g_object_unref (ia); + } + + g_ptr_array_set_size (list->array, 0); + + g_mime_event_emit (list->priv, NULL); +} + + +static int +_internet_address_list_add (InternetAddressList *list, InternetAddress *ia) +{ + int index; + + g_mime_event_add (ia->priv, (GMimeEventCallback) address_changed, list); + + index = list->array->len; + g_ptr_array_add (list->array, ia); + + return index; +} + + +/** + * internet_address_list_add: + * @list: a #InternetAddressList + * @ia: a #InternetAddress + * + * Adds an #InternetAddress to the #InternetAddressList. + * + * Returns: the index of the added #InternetAddress. + **/ +int +internet_address_list_add (InternetAddressList *list, InternetAddress *ia) +{ + int index; + + g_return_val_if_fail (IS_INTERNET_ADDRESS_LIST (list), -1); + g_return_val_if_fail (IS_INTERNET_ADDRESS (ia), -1); + + index = _internet_address_list_add (list, ia); + g_object_ref (ia); + + g_mime_event_emit (list->priv, NULL); + + return index; +} + + +/** + * internet_address_list_prepend: + * @list: a #InternetAddressList + * @prepend: a #InternetAddressList + * + * Inserts all of the addresses in @prepend to the beginning of @list. + **/ +void +internet_address_list_prepend (InternetAddressList *list, InternetAddressList *prepend) +{ + InternetAddress *ia; + char *dest, *src; + guint len, i; + + g_return_if_fail (IS_INTERNET_ADDRESS_LIST (prepend)); + g_return_if_fail (IS_INTERNET_ADDRESS_LIST (list)); + + if (prepend->array->len == 0) + return; + + len = prepend->array->len; + g_ptr_array_set_size (list->array, list->array->len + len); + + src = ((char *) list->array->pdata); + dest = src + (sizeof (void *) * len); + + g_memmove (dest, src, (sizeof (void *) * list->array->len)); + + for (i = 0; i < prepend->array->len; i++) { + ia = (InternetAddress *) prepend->array->pdata[i]; + g_mime_event_add (ia->priv, (GMimeEventCallback) address_changed, list); + list->array->pdata[i] = ia; + g_object_ref (ia); + } + + g_mime_event_emit (list->priv, NULL); +} + + +/** + * internet_address_list_append: + * @list: a #InternetAddressList + * @append: a #InternetAddressList + * + * Adds all of the addresses in @append to @list. + **/ +void +internet_address_list_append (InternetAddressList *list, InternetAddressList *append) +{ + InternetAddress *ia; + guint len, i; + + g_return_if_fail (IS_INTERNET_ADDRESS_LIST (append)); + g_return_if_fail (IS_INTERNET_ADDRESS_LIST (list)); + + len = list->array->len; + g_ptr_array_set_size (list->array, len + append->array->len); + + for (i = 0; i < append->array->len; i++) { + ia = (InternetAddress *) append->array->pdata[i]; + g_mime_event_add (ia->priv, (GMimeEventCallback) address_changed, list); + list->array->pdata[len + i] = ia; + g_object_ref (ia); + } + + g_mime_event_emit (list->priv, NULL); +} + + +/** + * internet_address_list_insert: + * @list: a #InternetAddressList + * @index: index to insert at + * @ia: a #InternetAddress + * + * Inserts an #InternetAddress into the #InternetAddressList at the + * specified index. + **/ +void +internet_address_list_insert (InternetAddressList *list, int index, InternetAddress *ia) +{ + char *dest, *src; + size_t n; + + g_return_if_fail (IS_INTERNET_ADDRESS_LIST (list)); + g_return_if_fail (IS_INTERNET_ADDRESS (ia)); + g_return_if_fail (index >= 0); + + g_mime_event_add (ia->priv, (GMimeEventCallback) address_changed, list); + g_object_ref (ia); + + if ((guint) index < list->array->len) { + g_ptr_array_set_size (list->array, list->array->len + 1); + + dest = ((char *) list->array->pdata) + (sizeof (void *) * (index + 1)); + src = ((char *) list->array->pdata) + (sizeof (void *) * index); + n = list->array->len - index - 1; + + g_memmove (dest, src, (sizeof (void *) * n)); + list->array->pdata[index] = ia; + } else { + /* the easy case */ + g_ptr_array_add (list->array, ia); + } + + g_mime_event_emit (list->priv, NULL); +} + + +/** + * internet_address_list_remove: + * @list: a #InternetAddressList + * @ia: a #InternetAddress + * + * Removes an #InternetAddress from the #InternetAddressList. + * + * Returns: %TRUE if the specified #InternetAddress was removed or + * %FALSE otherwise. + **/ +gboolean +internet_address_list_remove (InternetAddressList *list, InternetAddress *ia) +{ + int index; + + g_return_val_if_fail (IS_INTERNET_ADDRESS_LIST (list), FALSE); + g_return_val_if_fail (IS_INTERNET_ADDRESS (ia), FALSE); + + if ((index = internet_address_list_index_of (list, ia)) == -1) + return FALSE; + + internet_address_list_remove_at (list, index); + + return TRUE; +} + + +/** + * internet_address_list_remove_at: + * @list: a #InternetAddressList + * @index: index to remove + * + * Removes an #InternetAddress from the #InternetAddressList at the + * specified index. + * + * Returns: %TRUE if an #InternetAddress was removed or %FALSE + * otherwise. + **/ +gboolean +internet_address_list_remove_at (InternetAddressList *list, int index) +{ + InternetAddress *ia; + + g_return_val_if_fail (IS_INTERNET_ADDRESS_LIST (list), FALSE); + g_return_val_if_fail (index >= 0, FALSE); + + if ((guint) index >= list->array->len) + return FALSE; + + ia = list->array->pdata[index]; + g_mime_event_remove (ia->priv, (GMimeEventCallback) address_changed, list); + g_object_unref (ia); + + g_ptr_array_remove_index (list->array, index); + + g_mime_event_emit (list->priv, NULL); + + return TRUE; +} + + +/** + * internet_address_list_contains: + * @list: a #InternetAddressList + * @ia: a #InternetAddress + * + * Checks whether or not the specified #InternetAddress is contained + * within the #InternetAddressList. + * + * Returns: %TRUE if the specified #InternetAddress is contained + * within the specified #InternetAddressList or %FALSE otherwise. + **/ +gboolean +internet_address_list_contains (InternetAddressList *list, InternetAddress *ia) +{ + return internet_address_list_index_of (list, ia) != -1; +} + + +/** + * internet_address_list_index_of: + * @list: a #InternetAddressList + * @ia: a #InternetAddress + * + * Gets the index of the specified #InternetAddress inside the + * #InternetAddressList. + * + * Returns: the index of the requested #InternetAddress within the + * #InternetAddressList or %-1 if it is not contained within the + * #InternetAddressList. + **/ +int +internet_address_list_index_of (InternetAddressList *list, InternetAddress *ia) +{ + guint i; + + g_return_val_if_fail (IS_INTERNET_ADDRESS_LIST (list), -1); + g_return_val_if_fail (IS_INTERNET_ADDRESS (ia), -1); + + for (i = 0; i < list->array->len; i++) { + if (list->array->pdata[i] == ia) + return i; + } + + return -1; +} + + +/** + * internet_address_list_get_address: + * @list: a #InternetAddressList + * @index: index of #InternetAddress to get + * + * Gets the #InternetAddress at the specified index. + * + * Returns: the #InternetAddress at the specified index or %NULL if + * the index is out of range. + **/ +InternetAddress * +internet_address_list_get_address (InternetAddressList *list, int index) +{ + g_return_val_if_fail (IS_INTERNET_ADDRESS_LIST (list), NULL); + g_return_val_if_fail (index >= 0, NULL); + + if ((guint) index >= list->array->len) + return NULL; + + return list->array->pdata[index]; +} + + +/** + * internet_address_list_set_address: + * @list: a #InternetAddressList + * @index: index of #InternetAddress to set + * @ia: a #InternetAddress + * + * Sets the #InternetAddress at the specified index to @ia. + **/ +void +internet_address_list_set_address (InternetAddressList *list, int index, InternetAddress *ia) +{ + InternetAddress *old; + + g_return_if_fail (IS_INTERNET_ADDRESS_LIST (list)); + g_return_if_fail (IS_INTERNET_ADDRESS (ia)); + g_return_if_fail (index >= 0); + + if ((guint) index > list->array->len) + return; + + if ((guint) index == list->array->len) { + internet_address_list_add (list, ia); + return; + } + + if ((old = list->array->pdata[index]) == ia) + return; + + g_mime_event_remove (old->priv, (GMimeEventCallback) address_changed, list); + g_object_unref (old); + + g_mime_event_add (ia->priv, (GMimeEventCallback) address_changed, list); + list->array->pdata[index] = ia; + g_object_ref (ia); + + g_mime_event_emit (list->priv, NULL); +} + + +static char * +encoded_name (const char *raw, gboolean rfc2047_encode) +{ + char *name; + + g_return_val_if_fail (raw != NULL, NULL); + + if (rfc2047_encode) { + name = g_mime_utils_header_encode_phrase (raw); + } else { + name = g_mime_utils_quote_string (raw); + } + + return name; +} + +static void +linewrap (GString *string) +{ + if (string->len > 0 && string->str[string->len - 1] == ' ') { + string->str[string->len - 1] = '\n'; + g_string_append_c (string, '\t'); + } else { + g_string_append (string, "\n\t"); + } +} + +static void +append_folded_name (GString *string, size_t *linelen, const char *name) +{ + const char *word, *lwsp; + size_t len; + + word = name; + + while (*word) { + lwsp = word; + + if (*word == '"') { + /* quoted string, don't break these up */ + lwsp++; + + while (*lwsp && *lwsp != '"') { + if (*lwsp == '\\') + lwsp++; + + if (*lwsp) + lwsp++; + } + + if (*lwsp == '"') + lwsp++; + } else { + /* normal word */ + while (*lwsp && !is_lwsp (*lwsp)) + lwsp++; + } + + len = lwsp - word; + if (*linelen > 1 && (*linelen + len) > GMIME_FOLD_LEN) { + linewrap (string); + *linelen = 1; + } + + g_string_append_len (string, word, len); + *linelen += len; + + word = lwsp; + while (*word && is_lwsp (*word)) + word++; + + if (*word && is_lwsp (*lwsp)) { + g_string_append_c (string, ' '); + (*linelen)++; + } + } +} + +static void +mailbox_to_string (InternetAddress *ia, guint32 flags, size_t *linelen, GString *string) +{ + InternetAddressMailbox *mailbox = (InternetAddressMailbox *) ia; + gboolean encode = flags & INTERNET_ADDRESS_ENCODE; + gboolean fold = flags & INTERNET_ADDRESS_FOLD; + char *name; + size_t len; + + if (ia->name && *ia->name) { + name = encoded_name (ia->name, encode); + len = strlen (name); + + if (fold && (*linelen + len) > GMIME_FOLD_LEN) { + if (len > GMIME_FOLD_LEN) { + /* we need to break up the name */ + append_folded_name (string, linelen, name); + } else { + /* the name itself is short enough to fit on a single + * line, but only if we write it on a line by itself */ + if (*linelen > 1) { + linewrap (string); + *linelen = 1; + } + + g_string_append_len (string, name, len); + *linelen += len; + } + } else { + /* we can safely fit the name on this line */ + g_string_append_len (string, name, len); + *linelen += len; + } + + g_free (name); + + len = strlen (mailbox->addr); + + if (fold && (*linelen + len + 3) >= GMIME_FOLD_LEN) { + g_string_append_len (string, "\n\t<", 3); + *linelen = 2; + } else { + g_string_append_len (string, " <", 2); + *linelen += 2; + } + + g_string_append_len (string, mailbox->addr, len); + g_string_append_c (string, '>'); + *linelen += len + 1; + } else { + len = strlen (mailbox->addr); + + if (fold && (*linelen + len) > GMIME_FOLD_LEN) { + linewrap (string); + *linelen = 1; + } + + g_string_append_len (string, mailbox->addr, len); + *linelen += len; + } +} + +static void +_internet_address_list_to_string (const InternetAddressList *list, guint32 flags, size_t *linelen, GString *string) +{ + InternetAddress *ia; + guint i; + + for (i = 0; i < list->array->len; i++) { + ia = (InternetAddress *) list->array->pdata[i]; + + INTERNET_ADDRESS_GET_CLASS (ia)->to_string (ia, flags, linelen, string); + + if (i + 1 < list->array->len) { + g_string_append (string, ", "); + *linelen += 2; + } + } +} + +static void +group_to_string (InternetAddress *ia, guint32 flags, size_t *linelen, GString *string) +{ + InternetAddressGroup *group = (InternetAddressGroup *) ia; + gboolean encode = flags & INTERNET_ADDRESS_ENCODE; + gboolean fold = flags & INTERNET_ADDRESS_FOLD; + char *name = NULL; + size_t len = 0; + + if (ia->name != NULL) { + name = encoded_name (ia->name, encode); + len = strlen (name); + + if (fold && *linelen > 1 && (*linelen + len + 1) > GMIME_FOLD_LEN) { + linewrap (string); + *linelen = 1; + } + + g_string_append_len (string, name, len); + } + + g_string_append_len (string, ": ", 2); + *linelen += len + 2; + g_free (name); + + _internet_address_list_to_string (group->members, flags, linelen, string); + g_string_append_c (string, ';'); + *linelen += 1; +} + + +/** + * internet_address_list_to_string: + * @list: list of internet addresses + * @encode: %TRUE if the address should be rfc2047 encoded + * + * Allocates a string buffer containing the rfc822 formatted addresses + * in @list. + * + * Returns: a string containing the list of addresses in rfc822 format + * or %NULL if no addresses are contained in the list. + **/ +char * +internet_address_list_to_string (InternetAddressList *list, gboolean encode) +{ + guint32 flags = encode ? INTERNET_ADDRESS_ENCODE : 0; + size_t linelen = 0; + GString *string; + char *str; + + g_return_val_if_fail (IS_INTERNET_ADDRESS_LIST (list), NULL); + + if (list->array->len == 0) + return NULL; + + string = g_string_new (""); + _internet_address_list_to_string (list, flags, &linelen, string); + str = string->str; + + g_string_free (string, FALSE); + + return str; +} + + +/** + * internet_address_list_writer: + * @list: list of internet addresses + * @str: string to write to + * + * Writes the rfc2047-encoded rfc822 formatted addresses in @list to + * @string, folding appropriately. + **/ +void +internet_address_list_writer (InternetAddressList *list, GString *str) +{ + guint32 flags = INTERNET_ADDRESS_ENCODE | INTERNET_ADDRESS_FOLD; + size_t linelen = str->len; + + g_return_if_fail (IS_INTERNET_ADDRESS_LIST (list)); + g_return_if_fail (str != NULL); + + _internet_address_list_to_string (list, flags, &linelen, str); +} + +static void +_internet_address_decode_name (InternetAddress *ia, GString *name) +{ + char *value, *buf = NULL; + char *phrase; + + if (!g_utf8_validate (name->str, name->len, NULL)) { + /* A (broken) mailer has sent us raw 8bit/multibyte text data... */ + buf = g_mime_utils_decode_8bit (name->str, name->len); + phrase = buf; + } else { + phrase = name->str; + } + + /* decode the phrase */ + g_mime_utils_unquote_string (phrase); + value = g_mime_utils_header_decode_phrase (phrase); + g_free (ia->name); + ia->name = value; + g_free (buf); +} + +static InternetAddress *decode_address (const char **in); + +static void +skip_lwsp (const char **in) +{ + register const char *inptr = *in; + + while (*inptr && is_lwsp (*inptr)) + inptr++; + + *in = inptr; +} + +static InternetAddress * +decode_addrspec (const char **in) +{ + InternetAddress *mailbox = NULL; + const char *start, *inptr, *word; + gboolean got_local = FALSE; + GString *addr; + size_t len; + + addr = g_string_new (""); + inptr = *in; + + decode_lwsp (&inptr); + + /* some spam bots set their addresses to stuff like: ).ORHH@em.ca */ + while (*inptr && !(*inptr == '"' || is_atom (*inptr))) + inptr++; + + start = inptr; + + /* extract the first word of the local-part */ + if ((word = decode_word (&inptr))) { + g_string_append_len (addr, word, (size_t) (inptr - word)); + decode_lwsp (&inptr); + got_local = TRUE; + } + + /* extract the rest of the local-part */ + while (word && *inptr == '.') { + /* Note: According to the spec, only a single '.' is + * allowed between word tokens in the local-part of an + * addr-spec token, but according to Evolution bug + * #547969, some Japanese cellphones have email + * addresses that look like x..y@somewhere.jp */ + do { + inptr++; + decode_lwsp (&inptr); + g_string_append_c (addr, '.'); + } while (*inptr == '.'); + + if ((word = decode_word (&inptr))) + g_string_append_len (addr, word, (size_t) (inptr - word)); + + decode_lwsp (&inptr); + } + + if (*inptr == '@') { + len = addr->len; + + g_string_append_c (addr, '@'); + inptr++; + + if (!decode_domain (&inptr, addr)) { + /* drop the @domain and continue as if it weren't there */ + w(g_warning ("Missing domain in addr-spec: %.*s", + inptr - start, start)); + g_string_truncate (addr, len); + } + } else if (got_local) { + w(g_warning ("Missing '@' and domain in addr-spec: %.*s", + inptr - start, start)); + } + + *in = inptr; + + if (!got_local) { + w(g_warning ("Invalid addr-spec, missing local-part: %.*s", + inptr - start, start)); + g_string_free (addr, TRUE); + return NULL; + } + + mailbox = g_object_newv (INTERNET_ADDRESS_TYPE_MAILBOX, 0, NULL); + ((InternetAddressMailbox *) mailbox)->addr = addr->str; + g_string_free (addr, FALSE); + + return mailbox; +} + +static InternetAddress * +decode_group (const char **in) +{ + InternetAddressGroup *group; + InternetAddress *addr; + const char *inptr; + + inptr = *in; + + addr = internet_address_group_new (NULL); + group = (InternetAddressGroup *) addr; + + decode_lwsp (&inptr); + while (*inptr && *inptr != ';') { + InternetAddress *member; + + if ((member = decode_address (&inptr))) + _internet_address_group_add_member (group, member); + + decode_lwsp (&inptr); + while (*inptr == ',') { + inptr++; + decode_lwsp (&inptr); + if ((member = decode_address (&inptr))) + _internet_address_group_add_member (group, member); + + decode_lwsp (&inptr); + } + } + + *in = inptr; + + return addr; +} + +static InternetAddress * +decode_address (const char **in) +{ + const char *inptr, *start, *word, *comment = NULL; + InternetAddress *addr = NULL; + gboolean has_lwsp = FALSE; + gboolean is_word; + GString *name; + + decode_lwsp (in); + start = inptr = *in; + + name = g_string_new (""); + + /* Both groups and mailboxes can begin with a phrase (denoting + * the display name for the address). Collect all of the + * tokens that make up this name phrase. + */ + while (*inptr) { + if ((word = decode_word (&inptr))) { + g_string_append_len (name, word, (size_t) (inptr - word)); + + check_lwsp: + word = inptr; + skip_lwsp (&inptr); + + /* is the next token a word token? */ + is_word = *inptr == '"' || is_atom (*inptr); + + if (inptr > word && is_word) { + g_string_append_c (name, ' '); + has_lwsp = TRUE; + } + + if (is_word) + continue; + } + + /* specials = "(" / ")" / "<" / ">" / "@" ; Must be in quoted- + * / "," / ";" / ":" / "\" / <"> ; string, to use + * / "." / "[" / "]" ; within a word. + */ + if (*inptr == ':') { + /* group */ + inptr++; + addr = decode_group (&inptr); + decode_lwsp (&inptr); + if (*inptr != ';') + w(g_warning ("Invalid group spec, missing closing ';': %.*s", + inptr - start, start)); + else + inptr++; + break; + } else if (*inptr == '<') { + /* mailbox route-addr */ + inptr++; + addr = decode_addrspec (&inptr); + decode_lwsp (&inptr); + if (*inptr != '>') { + w(g_warning ("Invalid route-addr, missing closing '>': %.*s", + inptr - start, start)); + + while (*inptr && *inptr != '>' && *inptr != ',') + inptr++; + + if (*inptr == '>') + inptr++; + } else + inptr++; + + /* if comment is non-NULL, we can check for a comment containing a name */ + comment = inptr; + break; + } else if (*inptr == '(') { + /* beginning of a comment, use decode_lwsp() to skip past it */ + decode_lwsp (&inptr); + } else if (*inptr && strchr ("@,;", *inptr)) { + if (name->len == 0) { + if (*inptr == '@') { + GString *domain; + + w(g_warning ("Unexpected address: %s: skipping.", start)); + + /* skip over @domain? */ + inptr++; + domain = g_string_new (""); + decode_domain (&inptr, domain); + g_string_free (domain, TRUE); + } else { + /* empty address */ + } + break; + } else if (has_lwsp) { + /* assume this is just an unquoted special that we should + treat as part of the name */ + w(g_warning ("Unquoted '%c' in address name: %s: ignoring.", *inptr, start)); + g_string_append_c (name, *inptr); + inptr++; + + goto check_lwsp; + } + + addrspec: + /* what we thought was a name was actually an addrspec? */ + g_string_truncate (name, 0); + inptr = start; + + addr = decode_addrspec (&inptr); + + /* if comment is non-NULL, we can check for a comment containing a name */ + comment = inptr; + break; + } else if (*inptr == '.') { + /* This would normally signify that we are + * decoding the local-part of an addr-spec, + * but sadly, it is common for broken mailers + * to forget to quote/encode .'s in the name + * phrase. */ + g_string_append_c (name, *inptr); + inptr++; + + goto check_lwsp; + } else if (*inptr) { + /* Technically, these are all invalid tokens + * but in the interest of being liberal in + * what we accept, we'll ignore them. */ + w(g_warning ("Unexpected char '%c' in address: %s: ignoring.", *inptr, start)); + g_string_append_c (name, *inptr); + inptr++; + + goto check_lwsp; + } else { + goto addrspec; + } + } + + /* Note: will also skip over any comments */ + decode_lwsp (&inptr); + + if (name->len == 0 && comment && inptr > comment) { + /* missing a name, look for a trailing comment */ + if ((comment = memchr (comment, '(', inptr - comment))) { + const char *cend; + + /* find the end of the comment */ + cend = inptr - 1; + while (cend > comment && is_lwsp (*cend)) + cend--; + + if (*cend == ')') + cend--; + + g_string_append_len (name, comment + 1, (size_t) (cend - comment)); + } + } + + if (addr && name->len > 0) + _internet_address_decode_name (addr, name); + + g_string_free (name, TRUE); + + *in = inptr; + + return addr; +} + + +/** + * internet_address_list_parse_string: + * @str: a string containing internet addresses + * + * Construct a list of internet addresses from the given string. + * + * Returns: a #InternetAddressList or %NULL if the input string does + * not contain any addresses. + **/ +InternetAddressList * +internet_address_list_parse_string (const char *str) +{ + InternetAddressList *addrlist; + const char *inptr = str; + + addrlist = internet_address_list_new (); + + while (inptr && *inptr) { + InternetAddress *addr; + const char *start; + + start = inptr; + + if ((addr = decode_address (&inptr))) { + _internet_address_list_add (addrlist, addr); + } else { + w(g_warning ("Invalid or incomplete address: %.*s", + inptr - start, start)); + } + + decode_lwsp (&inptr); + if (*inptr == ',') { + inptr++; + } else if (*inptr) { + w(g_warning ("Parse error at '%s': expected ','", inptr)); + /* try skipping to the next address */ + if ((inptr = strchr (inptr, ','))) + inptr++; + } + } + + if (addrlist->array->len == 0) { + g_object_unref (addrlist); + addrlist = NULL; + } + + return addrlist; +} diff --git a/gmime/internet-address.h b/gmime/internet-address.h new file mode 100644 index 0000000..5a2a689 --- /dev/null +++ b/gmime/internet-address.h @@ -0,0 +1,206 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __INTERNET_ADDRESS_H__ +#define __INTERNET_ADDRESS_H__ + +#include +#include + +G_BEGIN_DECLS + +#define INTERNET_ADDRESS_TYPE (internet_address_get_type ()) +#define INTERNET_ADDRESS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), internet_address_get_type (), InternetAddress)) +#define INTERNET_ADDRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), internet_address_get_type (), InternetAddressClass)) +#define IS_INTERNET_ADDRESS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), internet_address_get_type ())) +#define IS_INTERNET_ADDRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), internet_address_get_type ())) +#define INTERNET_ADDRESS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), internet_address_get_type (), InternetAddressClass)) + +#define INTERNET_ADDRESS_TYPE_GROUP (internet_address_group_get_type ()) +#define INTERNET_ADDRESS_GROUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INTERNET_ADDRESS_TYPE_GROUP, InternetAddressGroup)) +#define INTERNET_ADDRESS_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), INTERNET_ADDRESS_TYPE_GROUP, InternetAddressGroupClass)) +#define INTERNET_ADDRESS_IS_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), INTERNET_ADDRESS_TYPE_GROUP)) +#define INTERNET_ADDRESS_IS_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), INTERNET_ADDRESS_TYPE_GROUP)) + +#define INTERNET_ADDRESS_TYPE_MAILBOX (internet_address_mailbox_get_type ()) +#define INTERNET_ADDRESS_MAILBOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INTERNET_ADDRESS_TYPE_MAILBOX, InternetAddressMailbox)) +#define INTERNET_ADDRESS_MAILBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), INTERNET_ADDRESS_TYPE_MAILBOX, InternetAddressMailboxClass)) +#define INTERNET_ADDRESS_IS_MAILBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), INTERNET_ADDRESS_TYPE_MAILBOX)) +#define INTERNET_ADDRESS_IS_MAILBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), INTERNET_ADDRESS_TYPE_MAILBOX)) + +#define INTERNET_ADDRESS_LIST_TYPE (internet_address_list_get_type ()) +#define INTERNET_ADDRESS_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INTERNET_ADDRESS_LIST_TYPE, InternetAddressList)) +#define INTERNET_ADDRESS_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), INTERNET_ADDRESS_LIST_TYPE, InternetAddressListClass)) +#define IS_INTERNET_ADDRESS_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), INTERNET_ADDRESS_LIST_TYPE)) +#define IS_INTERNET_ADDRESS_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), INTERNET_ADDRESS_LIST_TYPE)) + + +typedef struct _InternetAddress InternetAddress; +typedef struct _InternetAddressClass InternetAddressClass; + +typedef struct _InternetAddressGroup InternetAddressGroup; +typedef struct _InternetAddressGroupClass InternetAddressGroupClass; + +typedef struct _InternetAddressMailbox InternetAddressMailbox; +typedef struct _InternetAddressMailboxClass InternetAddressMailboxClass; + +typedef struct _InternetAddressList InternetAddressList; +typedef struct _InternetAddressListClass InternetAddressListClass; + + +/** + * InternetAddress: + * @parent_object: parent #GObject + * @priv: private data + * @name: display name + * + * An RFC 2822 Address object. + **/ +struct _InternetAddress { + GObject parent_object; + gpointer priv; + + char *name; +}; + +struct _InternetAddressClass { + GObjectClass parent_class; + + /* public virtual methods */ + void (* to_string) (InternetAddress *ia, guint32 flags, size_t *linelen, GString *out); +}; + + +GType internet_address_get_type (void); + +void internet_address_set_name (InternetAddress *ia, const char *name); +const char *internet_address_get_name (InternetAddress *ia); + +char *internet_address_to_string (InternetAddress *ia, gboolean encode); + + +/** + * InternetAddressMailbox: + * @parent_object: parent #InternetAddress + * @addr: address string + * + * An RFC 2822 Mailbox address. + **/ +struct _InternetAddressMailbox { + InternetAddress parent_object; + + char *addr; +}; + +struct _InternetAddressMailboxClass { + InternetAddressClass parent_class; + +}; + + +GType internet_address_mailbox_get_type (void); + +InternetAddress *internet_address_mailbox_new (const char *name, const char *addr); + +void internet_address_mailbox_set_addr (InternetAddressMailbox *mailbox, const char *addr); +const char *internet_address_mailbox_get_addr (InternetAddressMailbox *mailbox); + + +/** + * InternetAddressGroup: + * @parent_object: parent #InternetAddress + * @members: a #InternetAddressList of group members + * + * An RFC 2822 Group address. + **/ +struct _InternetAddressGroup { + InternetAddress parent_object; + + InternetAddressList *members; +}; + +struct _InternetAddressGroupClass { + InternetAddressClass parent_class; + +}; + + +GType internet_address_group_get_type (void); + +InternetAddress *internet_address_group_new (const char *name); + +void internet_address_group_set_members (InternetAddressGroup *group, InternetAddressList *members); +InternetAddressList *internet_address_group_get_members (InternetAddressGroup *group); + +int internet_address_group_add_member (InternetAddressGroup *group, InternetAddress *member); + + +/** + * InternetAddressList: + * @parent_object: parent #GObject + * @priv: private data + * @array: The array of #InternetAddress objects. + * + * A collection of #InternetAddress objects. + **/ +struct _InternetAddressList { + GObject parent_object; + gpointer priv; + + GPtrArray *array; +}; + +struct _InternetAddressListClass { + GObjectClass parent_class; + +}; + + +GType internet_address_list_get_type (void); + +InternetAddressList *internet_address_list_new (void); + +int internet_address_list_length (InternetAddressList *list); + +void internet_address_list_clear (InternetAddressList *list); + +int internet_address_list_add (InternetAddressList *list, InternetAddress *ia); +void internet_address_list_prepend (InternetAddressList *list, InternetAddressList *prepend); +void internet_address_list_append (InternetAddressList *list, InternetAddressList *append); +void internet_address_list_insert (InternetAddressList *list, int index, InternetAddress *ia); +gboolean internet_address_list_remove (InternetAddressList *list, InternetAddress *ia); +gboolean internet_address_list_remove_at (InternetAddressList *list, int index); + +gboolean internet_address_list_contains (InternetAddressList *list, InternetAddress *ia); +int internet_address_list_index_of (InternetAddressList *list, InternetAddress *ia); + +InternetAddress *internet_address_list_get_address (InternetAddressList *list, int index); +void internet_address_list_set_address (InternetAddressList *list, int index, InternetAddress *ia); + +char *internet_address_list_to_string (InternetAddressList *list, gboolean encode); + +InternetAddressList *internet_address_list_parse_string (const char *str); + +void internet_address_list_writer (InternetAddressList *list, GString *str); + +G_END_DECLS + +#endif /* __INTERNET_ADDRESS_H__ */ diff --git a/gtk-doc.make b/gtk-doc.make new file mode 100644 index 0000000..1f75dfd --- /dev/null +++ b/gtk-doc.make @@ -0,0 +1,280 @@ +# -*- mode: makefile -*- + +#################################### +# Everything below here is generic # +#################################### + +if GTK_DOC_USE_LIBTOOL +GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = $(LIBTOOL) --mode=execute +else +GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +GTKDOC_LD = $(CC) $(GTKDOC_DEPS_LIBS) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) +GTKDOC_RUN = +endif + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE) + +SETUP_FILES = \ + $(content_files) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt + +EXTRA_DIST = \ + $(HTML_IMAGES) \ + $(SETUP_FILES) + +DOC_STAMPS=setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \ + html-build.stamp pdf-build.stamp \ + tmpl.stamp sgml.stamp html.stamp pdf.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) + +if ENABLE_GTK_DOC +if GTK_DOC_BUILD_HTML +HTML_BUILD_STAMP=html-build.stamp +else +HTML_BUILD_STAMP= +endif +if GTK_DOC_BUILD_PDF +PDF_BUILD_STAMP=pdf-build.stamp +else +PDF_BUILD_STAMP= +endif + +all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) +else +all-local: +endif + +docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) + +$(REPORT_FILES): sgml-build.stamp + +#### setup #### + +setup-build.stamp: + -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + echo ' DOC Preparing build'; \ + files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ + if test "x$$files" != "x" ; then \ + for file in $$files ; do \ + test -f $(abs_srcdir)/$$file && \ + cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ + done; \ + fi; \ + test -d $(abs_srcdir)/tmpl && \ + { cp -rp $(abs_srcdir)/tmpl $(abs_builddir)/; \ + chmod -R u+w $(abs_builddir)/tmpl; } \ + fi + @touch setup-build.stamp + +#### scan #### + +scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) + @echo ' DOC Scanning header files' + @_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES) + @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ + echo " DOC Introspecting gobjects"; \ + scanobj_options=""; \ + gtkdoc-scangobj 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + scanobj_options="--verbose"; \ + fi; \ + fi; \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" \ + gtkdoc-scangobj $(SCANGOBJ_OPTIONS) $$scanobj_options --module=$(DOC_MODULE); \ + else \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + @touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp + @true + +#### templates #### + +tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt + @echo ' DOC Rebuilding template files' + @gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS) + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + if test -w $(abs_srcdir) ; then \ + cp -rp $(abs_builddir)/tmpl $(abs_srcdir)/; \ + fi \ + fi + @touch tmpl-build.stamp + +tmpl.stamp: tmpl-build.stamp + @true + +$(srcdir)/tmpl/*.sgml: + @true + +#### xml #### + +sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files) + @echo ' DOC Building XML' + @-chmod -R u+w $(srcdir) + @_source_dir='' ; \ + for i in $(DOC_SOURCE_DIR) ; do \ + _source_dir="$${_source_dir} --source-dir=$$i" ; \ + done ; \ + gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS) + @touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo ' DOC Building HTML' + @rm -rf html + @mkdir html + @mkhtml_options=""; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkhtml_options="$$mkhtml_options --verbose"; \ + fi; \ + fi; \ + gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \ + if test "$(?)" = "0"; then \ + mkhtml_options="$$mkhtml_options --path=\"$(abs_srcdir)\""; \ + fi; \ + cd html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE) + -@test "x$(HTML_IMAGES)" = "x" || \ + for file in $(HTML_IMAGES) ; do \ + if test -f $(abs_srcdir)/$$file ; then \ + cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ + fi; \ + if test -f $(abs_builddir)/$$file ; then \ + cp $(abs_builddir)/$$file $(abs_builddir)/html; \ + fi; \ + done; + @echo ' DOC Fixing cross-references' + @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + @touch html-build.stamp + +#### pdf #### + +pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo ' DOC Building PDF' + @rm -f $(DOC_MODULE).pdf + @mkpdf_options=""; \ + gtkdoc-mkpdf 2>&1 --help | grep >/dev/null "\-\-verbose"; \ + if test "$(?)" = "0"; then \ + if test "x$(V)" = "x1"; then \ + mkpdf_options="$$mkpdf_options --verbose"; \ + fi; \ + fi; \ + if test "x$(HTML_IMAGES)" != "x"; then \ + for img in $(HTML_IMAGES); do \ + part=`dirname $$img`; \ + echo $$mkpdf_options | grep >/dev/null "\-\-imgdir=$$part "; \ + if test $$? != 0; then \ + mkpdf_options="$$mkpdf_options --imgdir=$$part"; \ + fi; \ + done; \ + fi; \ + gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_options $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS) + @touch pdf-build.stamp + +############## + +clean-local: + @rm -f *~ *.bak + @rm -rf .libs + +distclean-local: + @rm -rf xml html $(REPORT_FILES) $(DOC_MODULE).pdf \ + $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ + rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \ + rm -rf tmpl; \ + fi + +maintainer-clean-local: clean + @rm -rf xml html + +install-data-local: + @installfiles=`echo $(builddir)/html/*`; \ + if test "$$installfiles" = '$(builddir)/html/*'; \ + then echo 1>&2 'Nothing to install' ; \ + else \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + $(mkinstalldirs) $${installdir} ; \ + for i in $$installfiles; do \ + echo ' $(INSTALL_DATA) '$$i ; \ + $(INSTALL_DATA) $$i $${installdir}; \ + done; \ + if test -n "$(DOC_MODULE_VERSION)"; then \ + mv -f $${installdir}/$(DOC_MODULE).devhelp2 \ + $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \ + fi; \ + $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \ + fi + +uninstall-local: + @if test -n "$(DOC_MODULE_VERSION)"; then \ + installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \ + else \ + installdir="$(DESTDIR)$(TARGET_DIR)"; \ + fi; \ + rm -rf $${installdir} + +# +# Require gtk-doc when making dist +# +if ENABLE_GTK_DOC +dist-check-gtkdoc: +else +dist-check-gtkdoc: + @echo "*** gtk-doc must be installed and enabled in order to make dist" + @false +endif + +dist-hook: dist-check-gtkdoc dist-hook-local + @mkdir $(distdir)/tmpl + @mkdir $(distdir)/html + @-cp ./tmpl/*.sgml $(distdir)/tmpl + @cp ./html/* $(distdir)/html + @-cp ./$(DOC_MODULE).pdf $(distdir)/ + @-cp ./$(DOC_MODULE).types $(distdir)/ + @-cp ./$(DOC_MODULE)-sections.txt $(distdir)/ + @cd $(distdir) && rm -f $(DISTCLEANFILES) + @$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html + +.PHONY : dist-hook-local docs diff --git a/iconv-detect.c b/iconv-detect.c new file mode 100644 index 0000000..0bc7dd9 --- /dev/null +++ b/iconv-detect.c @@ -0,0 +1,184 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 1999-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#include +#include +#include + +enum { + ISO_UNSUPPORTED = 0, + + /* iso-8859-1 */ + ISO_DASH_UINT_DASH_UINT_LOWER = (1 << 0), + ISO_DASH_UINT_DASH_UINT = (1 << 1), + ISO_UINT_DASH_UINT = (1 << 2), + ISO_UINT_UINT = (1 << 3), + ISO_UNDER_UINT_DASH_UINT = (1 << 4), + NO_ISO_UINT_DASH_UINT = (1 << 5), + + /* iso-10646-1 */ + /*ISO_DASH_UINT_DASH_UINT_LOWER = (1 << 0),*/ + /*ISO_DASH_UINT_DASH_UINT = (1 << 1),*/ + /*ISO_UINT_DASH_UINT = (1 << 2),*/ + ISO_DASH_UINT_LOWER = (1 << 3), + ISO_DASH_UINT = (1 << 4), + ISO_UINT = (1 << 5), + UCS4 = (1 << 6), + + /* iso-2022-jp */ + ISO_DASH_UINT_DASH_STR_LOWER = (1 << 0), + ISO_DASH_UINT_DASH_STR = (1 << 1), + ISO_UINT_DASH_STR = (1 << 2), +}; + + +typedef struct { + char *charset; + char *format; + int id; +} CharInfo; + + +static CharInfo iso8859_tests[] = { + { "iso-8859-1", "iso-%u-%u", ISO_DASH_UINT_DASH_UINT_LOWER }, + { "ISO-8859-1", "ISO-%u-%u", ISO_DASH_UINT_DASH_UINT }, + { "ISO8859-1", "ISO%u-%u", ISO_UINT_DASH_UINT }, + { "ISO88591", "ISO%u%u", ISO_UINT_UINT }, + { "ISO_8859-1", "ISO_%u-%u", ISO_UNDER_UINT_DASH_UINT }, + { "8859-1", "%u-%u", NO_ISO_UINT_DASH_UINT }, +}; + +static int num_iso8859_tests = sizeof (iso8859_tests) / sizeof (CharInfo); + +static CharInfo iso2022_tests[] = { + { "iso-2022-jp", "iso-%u-%s", ISO_DASH_UINT_DASH_STR_LOWER }, + { "ISO-2022-JP", "ISO-%u-%s", ISO_DASH_UINT_DASH_STR }, + { "ISO2022-JP", "ISO%u-%s", ISO_UINT_DASH_STR }, +}; + +static int num_iso2022_tests = sizeof (iso2022_tests) / sizeof (CharInfo); + +static CharInfo iso10646_tests[] = { + { "iso-10646-1", "iso-%u-%u", ISO_DASH_UINT_DASH_UINT_LOWER }, + { "ISO-10646-1", "ISO-%u-%u", ISO_DASH_UINT_DASH_UINT }, + { "ISO10646-1", "ISO%u-%u", ISO_UINT_DASH_UINT }, + { "iso-10646", "iso-%u", ISO_DASH_UINT_LOWER }, + { "ISO-10646", "ISO-%u", ISO_DASH_UINT }, + { "ISO10646", "ISO%u", ISO_UINT }, + { "UCS-4BE", "UCS-4BE", UCS4 }, +}; + +static int num_iso10646_tests = sizeof (iso10646_tests) / sizeof (CharInfo); + + +int main (int argc, char **argv) +{ + unsigned int iso8859, iso2022, iso10646; + CharInfo *info; + iconv_t cd; + FILE *fp; + int i; + + if (!(fp = fopen ("iconv-detect.h", "w"))) + return EXIT_FAILURE; + + fprintf (fp, "/* This is an auto-generated header, DO NOT EDIT! */\n\n"); + + iso8859 = ISO_UNSUPPORTED; + info = iso8859_tests; + /*printf ("#define DEFAULT_ISO_FORMAT(iso,codepage)\t");*/ + for (i = 0; i < num_iso8859_tests; i++) { + cd = iconv_open (info[i].charset, "UTF-8"); + if (cd != (iconv_t) -1) { + iconv_close (cd); + /*printf ("(\"%s\", (iso), (codepage))\n", info[i].format);*/ + fprintf (stderr, "System prefers %s\n", info[i].charset); + iso8859 = info[i].id; + break; + } + } + + if (iso8859 == ISO_UNSUPPORTED) { + fprintf (stderr, "System doesn't support any ISO-8859-1 formats\n"); + fprintf (fp, "#define ICONV_ISO_INT_FORMAT \"%s\"\n", info[0].format); +#ifdef CONFIGURE_IN + return EXIT_FAILURE; +#endif + } else { + fprintf (fp, "#define ICONV_ISO_INT_FORMAT \"%s\"\n", info[i].format); + } + + iso2022 = ISO_UNSUPPORTED; + info = iso2022_tests; + /*printf ("#define ISO_2022_FORMAT(iso,codepage)\t");*/ + for (i = 0; i < num_iso2022_tests; i++) { + cd = iconv_open (info[i].charset, "UTF-8"); + if (cd != (iconv_t) -1) { + iconv_close (cd); + /*printf ("(\"%s\", (iso), (codepage))\n", info[i].format);*/ + fprintf (stderr, "System prefers %s\n", info[i].charset); + iso2022 = info[i].id; + break; + } + } + + if (iso2022 == ISO_UNSUPPORTED) { + fprintf (stderr, "System doesn't support any ISO-2022 formats\n"); + fprintf (fp, "#define ICONV_ISO_STR_FORMAT \"%s\"\n", info[0].format); +#ifdef CONFIGURE_IN + return EXIT_FAILURE; +#endif + } else { + fprintf (fp, "#define ICONV_ISO_STR_FORMAT \"%s\"\n", info[i].format); + } + + iso10646 = ISO_UNSUPPORTED; + info = iso10646_tests; + /*printf ("#define ISO_10646_FORMAT(iso,codepage)\t");*/ + for (i = 0; i < num_iso10646_tests; i++) { + cd = iconv_open (info[i].charset, "UTF-8"); + if (cd != (iconv_t) -1) { + iconv_close (cd); + /*if (info[i].id < ISO_DASH_UINT_LOWER) + printf ("(\"%s\", (iso), (codepage))\n", info[i].format); + else + printf ("(\"%s\", (iso))\n", info[i].format);*/ + fprintf (stderr, "System prefers %s\n", info[i].charset); + iso10646 = info[i].id; + break; + } + } + + /* we don't need a printf format for iso-10646 because there is only 1 */ + if (iso10646 == ISO_UNSUPPORTED) { + fprintf (stderr, "System doesn't support any ISO-10646-1 formats\n"); + fprintf (fp, "#define ICONV_10646 \"%s\"\n", info[0].charset); +#ifdef CONFIGURE_IN + return EXIT_FAILURE; +#endif + } else { + fprintf (fp, "#define ICONV_10646 \"%s\"\n", info[i].charset); + } + + fclose (fp); + + return EXIT_SUCCESS; +} diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..a9244eb --- /dev/null +++ b/install-sh @@ -0,0 +1,527 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2011-01-19.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# 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. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + # Protect names problematic for `test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for `test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for `test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # 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 $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/ltmain.sh b/ltmain.sh new file mode 100644 index 0000000..c2852d8 --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,9661 @@ + +# libtool (GNU libtool) 2.4.2 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010, 2011 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. + +# GNU Libtool 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. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [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 +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --no-warn don't display warning messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# 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. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.2 Debian-2.4.2-1ubuntu1" +TIMESTAMP="" +package_revision=1.3337 + +# 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+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# 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' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# 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= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_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 $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_warning=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-warning|--no-warn) + opt_warning=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + 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 "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + 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 $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "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." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # 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 + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + 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." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + 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 $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + 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." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [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: $progname [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 + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +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: $progname [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: $progname [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: $progname [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 following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [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 + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -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 + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -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 + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +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: $progname [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." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + 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 + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # 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 $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + 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" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # 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. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + 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. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append 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 + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # 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" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + 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/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + 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*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + 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 "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# 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. +sed_quote_subst='$sed_quote_subst' + +# 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+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + 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 + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED '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 \"\$file\" | $SED '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 \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + 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 "\ + + # 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 "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # 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 \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${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\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # 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 invocation. + # 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 + base_compile="$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` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_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 + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append 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 + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append 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 + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + 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 + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + 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* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # 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 + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + 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. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'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\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$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 + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + 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 dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + 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 + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + 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 + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_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 + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $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" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + 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" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + 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. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append 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 + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + 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. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append 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 + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + 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" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append 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*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + 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 + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # 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 "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + 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 + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if 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 "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + 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* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + 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 "$opt_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" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + 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 && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$absdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + 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 + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append 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:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; 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:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + 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 + # 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 system can not link to static lib archive $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 "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + 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 + 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*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append 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 $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_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 + 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 "*) ;; + *) func_append 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 + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + 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 "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type \`$version_type'" + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + 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 + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + 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 + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + 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 + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "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 + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append 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 "*) ;; + *) func_append 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 "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append 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 behavior. + 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. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + 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 "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $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" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; 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 + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $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" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + 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 + ;; + esac + ;; + 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 with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + 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 + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # 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 + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_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 + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append 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 + func_append 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 "$opt_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 shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_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 "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_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 and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${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" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + 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" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append 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 "*) ;; + *) func_append 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + 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"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append 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 "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + 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 + func_append 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 + func_append 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 "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + 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" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED '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 "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "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}\" || $lt_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 + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + 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 $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "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}\" || $lt_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 + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + 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) + func_basename "$deplib" + name="$func_basename_result" + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# 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' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# 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 + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + 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) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + 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 func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append 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 + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$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 + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/m4/Makefile.am b/m4/Makefile.am new file mode 100644 index 0000000..af864e3 --- /dev/null +++ b/m4/Makefile.am @@ -0,0 +1 @@ +EXTRA_DIST = $(wildcard *.m4) diff --git a/m4/Makefile.in b/m4/Makefile.in new file mode 100644 index 0000000..bd48e85 --- /dev/null +++ b/m4/Makefile.in @@ -0,0 +1,421 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = m4 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +API_VERSION = @API_VERSION@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSC = @CSC@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GACUTIL = @GACUTIL@ +GAPI_CODEGEN = @GAPI_CODEGEN@ +GAPI_FIXUP = @GAPI_FIXUP@ +GAPI_PARSER = @GAPI_PARSER@ +GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@ +GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@ +GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TAR = @TAR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gacdir = @gacdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +EXTRA_DIST = $(wildcard *.m4) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign m4/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign m4/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-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/gtk-doc.m4 b/m4/gtk-doc.m4 new file mode 100644 index 0000000..0ada151 --- /dev/null +++ b/m4/gtk-doc.m4 @@ -0,0 +1,67 @@ +dnl -*- mode: autoconf -*- + +# serial 1 + +dnl Usage: +dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) +AC_DEFUN([GTK_DOC_CHECK], +[ + AC_REQUIRE([PKG_PROG_PKG_CONFIG]) + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + + dnl check for tools we added during development + AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check]) + AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true]) + AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf]) + + dnl for overriding the documentation installation directory + AC_ARG_WITH([html-dir], + AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, + [with_html_dir='${datadir}/gtk-doc/html']) + HTML_DIR="$with_html_dir" + AC_SUBST([HTML_DIR]) + + dnl enable/disable documentation building + AC_ARG_ENABLE([gtk-doc], + AS_HELP_STRING([--enable-gtk-doc], + [use gtk-doc to build documentation [[default=no]]]),, + [enable_gtk_doc=no]) + + if test x$enable_gtk_doc = xyes; then + ifelse([$1],[], + [PKG_CHECK_EXISTS([gtk-doc],, + AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], + [PKG_CHECK_EXISTS([gtk-doc >= $1],, + AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))]) + dnl don't check for glib if we build glib + if test "x$PACKAGE_NAME" != "xglib"; then + dnl don't fail if someone does not have glib + PKG_CHECK_MODULES(GTKDOC_DEPS, glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0,,) + fi + fi + + AC_MSG_CHECKING([whether to build gtk-doc documentation]) + AC_MSG_RESULT($enable_gtk_doc) + + dnl enable/disable output formats + AC_ARG_ENABLE([gtk-doc-html], + AS_HELP_STRING([--enable-gtk-doc-html], + [build documentation in html format [[default=yes]]]),, + [enable_gtk_doc_html=yes]) + AC_ARG_ENABLE([gtk-doc-pdf], + AS_HELP_STRING([--enable-gtk-doc-pdf], + [build documentation in pdf format [[default=no]]]),, + [enable_gtk_doc_pdf=no]) + + if test -z "$GTKDOC_MKPDF"; then + enable_gtk_doc_pdf=no + fi + + + AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes]) + AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes]) + AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"]) + AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"]) +]) diff --git a/m4/libtool.m4 b/m4/libtool.m4 new file mode 100644 index 0000000..828104c --- /dev/null +++ b/m4/libtool.m4 @@ -0,0 +1,8001 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# 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. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +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 + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +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' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# 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 +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # 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" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--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 +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + 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 + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + 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_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + 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 + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#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 + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 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; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +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 + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + 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="-ldld"], + [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="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + 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" + wl=$lt_prog_compiler_wl 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_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 + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_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 +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && 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 + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = 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 +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != 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 "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; 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 +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +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 +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +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" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + 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.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + 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}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + 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=`func_echo_all "$lib" | $SED '\''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' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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" + # 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* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # 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 + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + 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. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + 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}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # 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 + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # 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' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_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}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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 # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + 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 + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + 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" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$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}${shared_ext}$versuffix ${libname}${shared_ext}$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.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=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 + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +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 "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[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]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +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_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +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="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + 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 <<_LT_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 + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_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 +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])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 $CC]) + 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. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname 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 + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + 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 variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + 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|DragonFly)/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 + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + 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_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + 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 + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + 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 + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_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 + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + 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 + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# 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]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_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 $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf 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 +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # 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). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # 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). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # 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_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # 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). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # 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). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp 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'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # 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. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # 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 + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, 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 install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$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)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_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. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$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. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + 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 + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + 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]].*|aix[[5-9]]*) + 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. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=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 + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=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. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$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)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # 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. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=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*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$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' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$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' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='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' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=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. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) 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_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + 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 + ;; + + aix[[4-9]]*) + 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]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + 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]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + 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. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=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 + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=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. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + 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 + ;; + aix[[4-9]]*) + 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]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + 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 + ;; + aix[[4-9]]*) + 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]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 new file mode 100644 index 0000000..5d9acd8 --- /dev/null +++ b/m4/ltoptions.m4 @@ -0,0 +1,384 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# 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. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [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. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [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. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [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. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 new file mode 100644 index 0000000..9000a05 --- /dev/null +++ b/m4/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# 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. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 new file mode 100644 index 0000000..07a8602 --- /dev/null +++ b/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# 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. + +# @configure_input@ + +# serial 3337 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c573da9 --- /dev/null +++ b/m4/lt~obsolete.m4 @@ -0,0 +1,98 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# 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. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/missing b/missing new file mode 100755 index 0000000..86a8fc3 --- /dev/null +++ b/missing @@ -0,0 +1,331 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2012-01-06.13; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 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, see . + +# 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=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# 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 + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -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' + autom4te touch the output file, or create a stub one + 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 + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. 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 $msg. 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 $msg. 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 $msg. 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 + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. 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 test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. 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 test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. 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 "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. 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." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + 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 prerequisites 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 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/mono/AssemblyInfo.cs.in b/mono/AssemblyInfo.cs.in new file mode 100644 index 0000000..54d23f9 --- /dev/null +++ b/mono/AssemblyInfo.cs.in @@ -0,0 +1,4 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly:AssemblyVersion("@API_VERSION@")] diff --git a/mono/CertificateCollection.custom b/mono/CertificateCollection.custom new file mode 100644 index 0000000..518e512 --- /dev/null +++ b/mono/CertificateCollection.custom @@ -0,0 +1,243 @@ +#region Native Methods + [DllImport("gmime")] + static extern int g_mime_certificate_list_length (IntPtr list); + + [DllImport("gmime")] + static extern void g_mime_certificate_list_clear (IntPtr list); + + [DllImport("gmime")] + static extern int g_mime_certificate_list_add (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern void g_mime_certificate_list_insert (IntPtr list, int index, IntPtr ia); + + [DllImport("gmime")] + static extern bool g_mime_certificate_list_remove (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern bool g_mime_certificate_list_remove_at (IntPtr list, int index); + + [DllImport("gmime")] + static extern bool g_mime_certificate_list_contains (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern int g_mime_certificate_list_index_of (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern IntPtr g_mime_certificate_list_get_certificate (IntPtr list, int index); + + [DllImport("gmime")] + static extern void g_mime_certificate_list_set_certificate (IntPtr list, int index, IntPtr ia); +#endregion + + Exception CannotAdd (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot add objects of type '{0}' to a CertificateCollection.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotInsert (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot insert objects of type '{0}' into a CertificateCollection.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotRemove (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot remove objects of type '{0}' from a CertificateCollection.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotSet (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot set objects of type '{0}' on an CertificateCollection.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + public int Count { + get { return g_mime_certificate_list_length (Handle); } + } + + public bool IsFixedSize { + get { return false; } + } + + public bool IsReadOnly { + get { return false; } + } + + public bool IsSynchronized { + get { return false; } + } + + public object SyncRoot { + get { return this; } + } + + public int Add (Certificate cert) + { + if (cert == null) + throw CannotAdd (cert); + + return g_mime_certificate_list_add (Handle, cert.Handle); + } + + int IList.Add (object value) + { + Certificate cert = value as Certificate; + + if (cert == null) + throw CannotAdd (value); + + return Add (cert); + } + + public void Clear () + { + g_mime_certificate_list_clear (Handle); + } + + public bool Contains (Certificate cert) + { + if (cert == null) + return false; + + return g_mime_certificate_list_contains (Handle, cert.Handle); + } + + bool IList.Contains (object value) + { + return Contains (value as Certificate); + } + + public void CopyTo (Array array, int index) + { + if (array == null) + throw new ArgumentNullException ("array"); + + if (index < 0) + throw new ArgumentOutOfRangeException ("index"); + + int n = Count; + + for (int i = 0; i < n; i++) + array.SetValue (((IList) this)[i], index + i); + } + + public IEnumerator GetEnumerator () + { + int n = Count; + + for (int i = 0; i < n; i++) + yield return this[i]; + + yield break; + } + + public int IndexOf (Certificate cert) + { + if (cert == null) + return -1; + + return g_mime_certificate_list_index_of (Handle, cert.Handle); + } + + int IList.IndexOf (object value) + { + return IndexOf (value as Certificate); + } + + public void Insert (int index, Certificate cert) + { + if (cert == null) + throw CannotInsert (cert); + + if (index < 0) + throw new ArgumentOutOfRangeException ("index"); + + g_mime_certificate_list_insert (Handle, index, cert.Handle); + } + + void IList.Insert (int index, object value) + { + Certificate cert = value as Certificate; + + if (cert == null) + throw CannotInsert (value); + + Insert (index, cert); + } + + public void Remove (Certificate cert) + { + if (cert == null) + throw CannotRemove (cert); + + g_mime_certificate_list_remove (Handle, cert.Handle); + } + + void IList.Remove (object value) + { + Certificate cert = value as Certificate; + + if (cert == null) + throw CannotRemove (value); + + Remove (cert); + } + + public void RemoveAt (int index) + { + if (index < 0 || index >= Count) + throw new ArgumentOutOfRangeException ("index"); + + g_mime_certificate_list_remove_at (Handle, index); + } + + public Certificate this[int index] { + get { + IntPtr raw = g_mime_certificate_list_get_certificate (Handle, index); + + if (raw == IntPtr.Zero) + return null; + + return GLib.Object.GetObject (raw) as Certificate; + } + + set { + if (value == null) + throw CannotSet (value); + + g_mime_certificate_list_set_certificate (Handle, index, value.Handle); + } + } + + object IList.this[int index] { + get { + return this[index]; + } + + set { + this[index] = value as Certificate; + } + } diff --git a/mono/DataWrapper.custom b/mono/DataWrapper.custom new file mode 100644 index 0000000..6365f3d --- /dev/null +++ b/mono/DataWrapper.custom @@ -0,0 +1,25 @@ +public StreamWrapper Stream { + get { + GMime.Stream gmime_stream = GMimeStream; + GMime.StreamFilter filtered_stream; + FilterBasic filter; + + switch (Encoding) { + case ContentEncoding.QuotedPrintable: + case ContentEncoding.UuEncode: + case ContentEncoding.Base64: + filtered_stream = new GMime.StreamFilter (gmime_stream); + filter = new FilterBasic (Encoding, false); + filtered_stream.Add (filter); + gmime_stream.Dispose (); + filter.Dispose (); + + gmime_stream = filtered_stream; + break; + default: + break; + } + + return new StreamWrapper (gmime_stream); + } +} diff --git a/mono/GMime.metadata b/mono/GMime.metadata new file mode 100644 index 0000000..3002c45 --- /dev/null +++ b/mono/GMime.metadata @@ -0,0 +1,367 @@ + + + + guint32 + guint32 + guint32 + guint32* + + + gint32 + + + + + GetUserCharsets + GetCharset + GetLanguage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GetCreationDate + SetCreationDate + GetExpirationDate + SetExpirationDate + + + + CertificateCollection + + + + + + + + + + + + + + + + + + + + GetCreationDate + SetCreationDate + GetExpirationDate + SetExpirationDate + + + + SignatureCollection + + + + + + + + + + + + + + + + + + + + + + GetGMimeStream + SetGMimeStream + + + const-guint8* + true + n_inbuf + guint8* + true + guint8* + true + ref + ref + yEncodeClose + yEncodeStep + yDecodeStep + const-guint8* + true + n_inbuf + guint8* + true + ref + ref + ref + const-guint8* + true + n_inbuf + guint8* + true + ref + ref + ref + /api/namespace/struct[@name='Encoding'] + /api/namespace/struct[@name='Encoding'] + /api/namespace/struct[@name='Encoding'] + + + SevenBit + EightBit + + Default + SevenBit + EightBit + Binary + Base64 + QuotedPrintable + UuEncode + + 0 + 1 + 2 + + None + ExpiredSignature + NoPublicKey + ExpiredSignatureKey + RevokedSignatureKey + UnsupportedAlgorithm + + + 1 + ApplyFilter + const-guint8* + true + n_inbuf + guint8** + true + buf + const-guint8* + true + n_buf + + + GetBestCharset + GetBestEncoding + + + + + + + + + + + + + + + true + true + + + + + + + void + MoveFirst + MoveLast + MoveNext + MovePrev + true + + + + + + + + + + 1 + + + + + + + GetAddress + SetAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + true + n_partials + + + + + + + + + + + + + + + + + + + + + + + out + + + + + Entity + + + + + + + + + + + + + + + + + + + + + + true + true + + + + + + + + + + + + + true + Parse + + + + + + + + 1 + GetLength + const-guint8* + true + const-guint8* + true + Write + + + true + + + true + + + + + const-guint8* + true + n_text + + + + true + + diff --git a/mono/Global.custom b/mono/Global.custom new file mode 100644 index 0000000..0ef8f6c --- /dev/null +++ b/mono/Global.custom @@ -0,0 +1,25 @@ + public enum InitFlags { + None = 0, + EnableRfc2047Workarounds = (1 << 0), + } + + [DllImport("gmime")] + static extern void g_mime_init (int flags); + + public static void Init () + { + g_mime_init (0); + } + + public static void Init (InitFlags flags) + { + g_mime_init ((int) flags); + } + + [DllImport("gmime")] + static extern void g_mime_shutdown (); + + public static void Shutdown () + { + g_mime_shutdown (); + } diff --git a/mono/Header.cs b/mono/Header.cs new file mode 100644 index 0000000..702e603 --- /dev/null +++ b/mono/Header.cs @@ -0,0 +1,21 @@ +using System; + +namespace GMime { + public class Header { + public Header () { } + + public Header (string name, string value) + { + Value = value; + Name = name; + } + + public string Name { + get; set; + } + + public string Value { + get; set; + } + } +} diff --git a/mono/HeaderEnumerator.cs b/mono/HeaderEnumerator.cs new file mode 100644 index 0000000..11431a6 --- /dev/null +++ b/mono/HeaderEnumerator.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections; + +namespace GMime { + public class HeaderEnumerator : IEnumerator, IDisposable { + bool premove = true; + HeaderList headers; + HeaderIter iter; + + public HeaderEnumerator (HeaderList headers) + { + if (headers == null) + throw new ArgumentNullException ("headers"); + + iter = headers.GetIter (); + this.headers = headers; + } + + public Header Current { + get { + CheckDisposed (); + return new Header (iter.Name, iter.Value); + } + } + + object IEnumerator.Current { + get { return Current; } + } + + public string Name { + get { + CheckDisposed (); + return iter.Name; + } + } + + public string Value { + set { + CheckDisposed (); + iter.Value = value; + } + + get { + CheckDisposed (); + return iter.Value; + } + } + + public bool MoveFirst () + { + CheckDisposed (); + + premove = false; + return iter.MoveFirst (); + } + + public bool MoveLast () + { + CheckDisposed (); + + premove = false; + return iter.MoveLast (); + } + + public bool MoveNext () + { + CheckDisposed (); + + if (premove) { + premove = false; + return iter.MoveFirst (); + } + + return iter.MoveNext (); + } + + public bool MovePrev () + { + CheckDisposed (); + + if (premove) + return false; + + premove = false; + return iter.MovePrev (); + } + + public bool Remove () + { + CheckDisposed (); + return iter.Remove (); + } + + public void Reset () + { + CheckDisposed (); + iter.MoveFirst (); + premove = true; + } + + void CheckDisposed () + { + if (headers == null) + throw new ObjectDisposedException ("The HeaderEnumerator has been disposed."); + } + + public void Dispose () + { + headers = null; + iter = null; + } + } +} diff --git a/mono/HeaderList.custom b/mono/HeaderList.custom new file mode 100644 index 0000000..9cea737 --- /dev/null +++ b/mono/HeaderList.custom @@ -0,0 +1,56 @@ + [DllImport ("gmime")] + static extern IntPtr g_mime_header_list_set (IntPtr raw, IntPtr name, IntPtr value); + + [DllImport ("gmime")] + static extern IntPtr g_mime_header_list_get (IntPtr raw, IntPtr name); + + public string this[string name] { + get { + if (name == null) + throw new ArgumentNullException ("name"); + + IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name); + IntPtr raw_ret = g_mime_header_list_get (Handle, native_name); + string ret = GLib.Marshaller.Utf8PtrToString (raw_ret); + GLib.Marshaller.Free (native_name); + + return ret; + } + + set { + if (name == null) + throw new ArgumentNullException ("name"); + + IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup (name); + IntPtr native_value = GLib.Marshaller.StringToPtrGStrdup (value); + g_mime_header_list_set (Handle, native_name, native_value); + GLib.Marshaller.Free (native_value); + GLib.Marshaller.Free (native_name); + } + } + + [DllImport ("gmime")] + static extern bool g_mime_header_list_get_iter (IntPtr raw, IntPtr iter); + + internal HeaderIter GetIter () + { + HeaderIter iter = new HeaderIter (); + + g_mime_header_list_get_iter (Handle, iter.Handle); + + return iter; + } + + public IEnumerator GetEnumerator () + { + return new HeaderEnumerator (this); + } + + public StreamWrapper Stream { + get { + GMime.StreamMem mem_stream = new GMime.StreamMem (); + this.WriteToStream (mem_stream); + mem_stream.Seek (0); + return new StreamWrapper (mem_stream); + } + } diff --git a/mono/InternetAddress.custom b/mono/InternetAddress.custom new file mode 100644 index 0000000..7edc1c1 --- /dev/null +++ b/mono/InternetAddress.custom @@ -0,0 +1,4 @@ + public override string ToString () + { + return ToString (false); + } diff --git a/mono/InternetAddressList.custom b/mono/InternetAddressList.custom new file mode 100644 index 0000000..29d5ad9 --- /dev/null +++ b/mono/InternetAddressList.custom @@ -0,0 +1,281 @@ +#region Native Methods + [DllImport("gmime")] + static extern int internet_address_list_length (IntPtr list); + + [DllImport("gmime")] + static extern void internet_address_list_clear (IntPtr list); + + [DllImport("gmime")] + static extern int internet_address_list_add (IntPtr list, IntPtr ia); + + //[DllImport("gmime")] + //static extern void internet_address_list_concat (IntPtr list, IntPtr concat); + + [DllImport("gmime")] + static extern void internet_address_list_insert (IntPtr list, int index, IntPtr ia); + + [DllImport("gmime")] + static extern bool internet_address_list_remove (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern bool internet_address_list_remove_at (IntPtr list, int index); + + [DllImport("gmime")] + static extern bool internet_address_list_contains (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern int internet_address_list_index_of (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern IntPtr internet_address_list_get_address (IntPtr list, int index); + + [DllImport("gmime")] + static extern void internet_address_list_set_address (IntPtr list, int index, IntPtr ia); + + [DllImport("gmime")] + static extern IntPtr internet_address_list_to_string (IntPtr list, bool encode); + + [DllImport("gmime")] + static extern IntPtr internet_address_list_parse_string (IntPtr str); +#endregion + + Exception CannotAdd (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot add objects of type '{0}' to an InternetAddressList.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotInsert (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot insert objects of type '{0}' into an InternetAddressList.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotRemove (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot remove objects of type '{0}' from an InternetAddressList.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotSet (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot set objects of type '{0}' on an InternetAddressList.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + public int Count { + get { return internet_address_list_length (Handle); } + } + + public bool IsFixedSize { + get { return false; } + } + + public bool IsReadOnly { + get { return false; } + } + + public bool IsSynchronized { + get { return false; } + } + + public object SyncRoot { + get { return this; } + } + + public int Add (InternetAddress addr) + { + if (addr == null) + throw CannotAdd (addr); + + return internet_address_list_add (Handle, addr.Handle); + } + + int IList.Add (object value) + { + InternetAddress addr = value as InternetAddress; + + if (addr == null) + throw CannotAdd (value); + + return Add (addr); + } + + public void Clear () + { + internet_address_list_clear (Handle); + } + + public bool Contains (InternetAddress addr) + { + if (addr == null) + return false; + + return internet_address_list_contains (Handle, addr.Handle); + } + + bool IList.Contains (object value) + { + return Contains (value as InternetAddress); + } + + public void CopyTo (Array array, int index) + { + if (array == null) + throw new ArgumentNullException ("array"); + + if (index < 0) + throw new ArgumentOutOfRangeException ("index"); + + int n = Count; + + for (int i = 0; i < n; i++) + array.SetValue (((IList) this)[i], index + i); + } + + public IEnumerator GetEnumerator () + { + int n = Count; + + for (int i = 0; i < n; i++) + yield return this[i]; + + yield break; + } + + public int IndexOf (InternetAddress addr) + { + if (addr == null) + return -1; + + return internet_address_list_index_of (Handle, addr.Handle); + } + + int IList.IndexOf (object value) + { + return IndexOf (value as InternetAddress); + } + + public void Insert (int index, InternetAddress addr) + { + if (addr == null) + throw CannotInsert (addr); + + if (index < 0) + throw new ArgumentOutOfRangeException ("index"); + + internet_address_list_insert (Handle, index, addr.Handle); + } + + void IList.Insert (int index, object value) + { + InternetAddress addr = value as InternetAddress; + + if (addr == null) + throw CannotInsert (value); + + Insert (index, addr); + } + + public void Remove (InternetAddress addr) + { + if (addr == null) + throw CannotRemove (addr); + + internet_address_list_remove (Handle, addr.Handle); + } + + void IList.Remove (object value) + { + InternetAddress addr = value as InternetAddress; + + if (addr == null) + throw CannotRemove (value); + + Remove (addr); + } + + public void RemoveAt (int index) + { + if (index < 0 || index >= Count) + throw new ArgumentOutOfRangeException ("index"); + + internet_address_list_remove_at (Handle, index); + } + + public InternetAddress this[int index] { + get { + IntPtr raw = internet_address_list_get_address (Handle, index); + + if (raw == IntPtr.Zero) + return null; + + return GLib.Object.GetObject (raw) as InternetAddress; + } + + set { + if (value == null) + throw CannotSet (value); + + internet_address_list_set_address (Handle, index, value.Handle); + } + } + + object IList.this[int index] { + get { + return this[index]; + } + + set { + this[index] = value as InternetAddress; + } + } + + public static InternetAddressList Parse (string str) + { + IntPtr native_str = GLib.Marshaller.StringToPtrGStrdup (str); + IntPtr raw = internet_address_list_parse_string (native_str); + InternetAddressList list = null; + + if (raw != IntPtr.Zero) + list = new InternetAddressList (raw); + + GLib.Marshaller.Free (native_str); + + return list; + } + + public string ToString (bool encode) + { + IntPtr raw = internet_address_list_to_string (Handle, encode); + + if (raw == IntPtr.Zero) + return String.Empty; + + return GLib.Marshaller.PtrToStringGFree (raw); + } + + public override string ToString () + { + return ToString (false); + } diff --git a/mono/Makefile.am b/mono/Makefile.am new file mode 100644 index 0000000..05c912b --- /dev/null +++ b/mono/Makefile.am @@ -0,0 +1,120 @@ +API = gmime-api.xml +SNK = gmime-sharp.snk +RAW_API = gmime-api.raw +METADATA = GMime.metadata +ASSEMBLY_NAME = gmime-sharp +references = $(GLIB_SHARP_LIBS) +SOURCES_XML = sources.xml + +PACKAGE_SHARP = $(PACKAGE)-sharp-$(GMIME_API_VERSION) +ASSEMBLY = $(ASSEMBLY_NAME).dll +TARGET = $(ASSEMBLY) $(ASSEMBLY).config +TARGET_API = $(API) +noinst_DATA = $(API) $(ASSEMBLY) $(ASSEMBLY).config +CLEANFILES = $(ASSEMBLY) generated-stamp generated/*.cs $(API) +DISTCLEANFILES = $(ASSEMBLY).config AssemblyInfo.cs gmime-sharp-$(GMIME_API_VERSION).pc +GACUTIL_DESTDIR_FLAGS = -package $(PACKAGE_SHARP) -root $(DESTDIR)$(gacdir) +GACUTIL_FLAGS = -package $(PACKAGE_SHARP) -gacdir $(gacdir) + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = $(PACKAGE_SHARP).pc +gapidir = $(datadir)/gapi-2.0 +gapi_DATA = $(TARGET_API) + +sources = \ + StreamWrapper.cs \ + HeaderEnumerator.cs \ + Header.cs + +build_sources = \ + $(srcdir)/StreamWrapper.cs \ + $(srcdir)/HeaderEnumerator.cs \ + $(srcdir)/Header.cs \ + AssemblyInfo.cs + +customs = \ + CertificateCollection.custom \ + DataWrapper.custom \ + Global.custom \ + HeaderList.custom \ + InternetAddress.custom \ + InternetAddressList.custom \ + Message.custom \ + Multipart.custom \ + Object.custom \ + SignatureCollection.custom \ + Stream.custom + +build_customs = \ + $(srcdir)/CertificateCollection.custom \ + $(srcdir)/DataWrapper.custom \ + $(srcdir)/Global.custom \ + $(srcdir)/HeaderList.custom \ + $(srcdir)/InternetAddress.custom \ + $(srcdir)/InternetAddressList.custom \ + $(srcdir)/Message.custom \ + $(srcdir)/Multipart.custom \ + $(srcdir)/Object.custom \ + $(srcdir)/SignatureCollection.custom \ + $(srcdir)/Stream.custom + +EXTRA_DIST = \ + $(ASSEMBLY).config.in \ + AssemblyInfo.cs.in \ + $(SNK) \ + $(METADATA) \ + $(RAW_API) \ + $(customs) \ + $(sources) \ + $(SOURCES_XML) \ + gmime-sharp.pc.in + +$(PACKAGE_SHARP).pc: gmime-sharp.pc + -cp gmime-sharp.pc $(PACKAGE_SHARP).pc + +$(API): $(srcdir)/$(RAW_API) $(srcdir)/$(METADATA) + cp $(srcdir)/$(RAW_API) $(API) + chmod u+w $(API) + $(GAPI_FIXUP) --api=$(API) --metadata=$(srcdir)/$(METADATA) + +generated-stamp: $(API) $(build_customs) + rm -f generated/* && \ + $(GAPI_CODEGEN) --generate $(API) --outdir=generated --customdir=$(srcdir) --assembly-name=$(ASSEMBLY_NAME) \ + && touch generated-stamp + +if PLATFORM_WIN32 +GAPI_CDECL_INSERT=$(top_srcdir)/gapi-cdecl-insert --keyfile=$(SNK) $(ASSEMBLY) +else +GAPI_CDECL_INSERT= +endif + +$(ASSEMBLY): $(build_sources) generated-stamp $(srcdir)/$(ASSEMBLY_NAME).snk + $(CSC) -unsafe /out:$(ASSEMBLY) /target:library $(references) \ + -keyfile:$(srcdir)/$(ASSEMBLY_NAME).snk $(build_sources) generated/*.cs + $(GAPI_CDECL_INSERT) + sn -q -R $(ASSEMBLY) $(srcdir)/$(SNK) + +install-data-local: + @if test -n '$(TARGET)'; then \ + if test -n '$(DESTDIR)'; then \ + echo "$(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_DESTDIR_FLAGS)"; \ + $(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_DESTDIR_FLAGS) || exit 1; \ + else \ + echo "$(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_FLAGS)"; \ + $(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_FLAGS) || exit 1; \ + fi; \ + fi + +uninstall-local: + @if test -n '$(TARGET)'; then \ + if test -n '$(DESTDIR)'; then \ + echo "$(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_DESTDIR_FLAGS)"; \ + $(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_DESTDIR_FLAGS) || exit 1; \ + else \ + echo "$(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS)"; \ + $(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS) || exit 1; \ + fi; \ + fi + +parse: + $(GAPI_PARSER) $(SOURCES_XML) diff --git a/mono/Makefile.in b/mono/Makefile.in new file mode 100644 index 0000000..4329e20 --- /dev/null +++ b/mono/Makefile.in @@ -0,0 +1,618 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = mono +DIST_COMMON = $(srcdir)/AssemblyInfo.cs.in $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/gmime-sharp.dll.config.in \ + $(srcdir)/gmime-sharp.pc.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = AssemblyInfo.cs gmime-sharp.dll.config \ + gmime-sharp.pc +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(gapidir)" "$(DESTDIR)$(pkgconfigdir)" +DATA = $(gapi_DATA) $(noinst_DATA) $(pkgconfig_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +API_VERSION = @API_VERSION@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSC = @CSC@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GACUTIL = @GACUTIL@ +GAPI_CODEGEN = @GAPI_CODEGEN@ +GAPI_FIXUP = @GAPI_FIXUP@ +GAPI_PARSER = @GAPI_PARSER@ +GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@ +GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@ +GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TAR = @TAR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gacdir = @gacdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +API = gmime-api.xml +SNK = gmime-sharp.snk +RAW_API = gmime-api.raw +METADATA = GMime.metadata +ASSEMBLY_NAME = gmime-sharp +references = $(GLIB_SHARP_LIBS) +SOURCES_XML = sources.xml +PACKAGE_SHARP = $(PACKAGE)-sharp-$(GMIME_API_VERSION) +ASSEMBLY = $(ASSEMBLY_NAME).dll +TARGET = $(ASSEMBLY) $(ASSEMBLY).config +TARGET_API = $(API) +noinst_DATA = $(API) $(ASSEMBLY) $(ASSEMBLY).config +CLEANFILES = $(ASSEMBLY) generated-stamp generated/*.cs $(API) +DISTCLEANFILES = $(ASSEMBLY).config AssemblyInfo.cs gmime-sharp-$(GMIME_API_VERSION).pc +GACUTIL_DESTDIR_FLAGS = -package $(PACKAGE_SHARP) -root $(DESTDIR)$(gacdir) +GACUTIL_FLAGS = -package $(PACKAGE_SHARP) -gacdir $(gacdir) +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = $(PACKAGE_SHARP).pc +gapidir = $(datadir)/gapi-2.0 +gapi_DATA = $(TARGET_API) +sources = \ + StreamWrapper.cs \ + HeaderEnumerator.cs \ + Header.cs + +build_sources = \ + $(srcdir)/StreamWrapper.cs \ + $(srcdir)/HeaderEnumerator.cs \ + $(srcdir)/Header.cs \ + AssemblyInfo.cs + +customs = \ + CertificateCollection.custom \ + DataWrapper.custom \ + Global.custom \ + HeaderList.custom \ + InternetAddress.custom \ + InternetAddressList.custom \ + Message.custom \ + Multipart.custom \ + Object.custom \ + SignatureCollection.custom \ + Stream.custom + +build_customs = \ + $(srcdir)/CertificateCollection.custom \ + $(srcdir)/DataWrapper.custom \ + $(srcdir)/Global.custom \ + $(srcdir)/HeaderList.custom \ + $(srcdir)/InternetAddress.custom \ + $(srcdir)/InternetAddressList.custom \ + $(srcdir)/Message.custom \ + $(srcdir)/Multipart.custom \ + $(srcdir)/Object.custom \ + $(srcdir)/SignatureCollection.custom \ + $(srcdir)/Stream.custom + +EXTRA_DIST = \ + $(ASSEMBLY).config.in \ + AssemblyInfo.cs.in \ + $(SNK) \ + $(METADATA) \ + $(RAW_API) \ + $(customs) \ + $(sources) \ + $(SOURCES_XML) \ + gmime-sharp.pc.in + +@PLATFORM_WIN32_FALSE@GAPI_CDECL_INSERT = +@PLATFORM_WIN32_TRUE@GAPI_CDECL_INSERT = $(top_srcdir)/gapi-cdecl-insert --keyfile=$(SNK) $(ASSEMBLY) +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign mono/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign mono/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +AssemblyInfo.cs: $(top_builddir)/config.status $(srcdir)/AssemblyInfo.cs.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +gmime-sharp.dll.config: $(top_builddir)/config.status $(srcdir)/gmime-sharp.dll.config.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +gmime-sharp.pc: $(top_builddir)/config.status $(srcdir)/gmime-sharp.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-gapiDATA: $(gapi_DATA) + @$(NORMAL_INSTALL) + test -z "$(gapidir)" || $(MKDIR_P) "$(DESTDIR)$(gapidir)" + @list='$(gapi_DATA)'; test -n "$(gapidir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(gapidir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(gapidir)" || exit $$?; \ + done + +uninstall-gapiDATA: + @$(NORMAL_UNINSTALL) + @list='$(gapi_DATA)'; test -n "$(gapidir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(gapidir)'; $(am__uninstall_files_from_dir) +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$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 $(DATA) +installdirs: + for dir in "$(DESTDIR)$(gapidir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +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 + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local install-gapiDATA \ + install-pkgconfigDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-gapiDATA uninstall-local \ + uninstall-pkgconfigDATA + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-local install-dvi \ + install-dvi-am install-exec install-exec-am install-gapiDATA \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-pkgconfigDATA \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-gapiDATA uninstall-local uninstall-pkgconfigDATA + + +$(PACKAGE_SHARP).pc: gmime-sharp.pc + -cp gmime-sharp.pc $(PACKAGE_SHARP).pc + +$(API): $(srcdir)/$(RAW_API) $(srcdir)/$(METADATA) + cp $(srcdir)/$(RAW_API) $(API) + chmod u+w $(API) + $(GAPI_FIXUP) --api=$(API) --metadata=$(srcdir)/$(METADATA) + +generated-stamp: $(API) $(build_customs) + rm -f generated/* && \ + $(GAPI_CODEGEN) --generate $(API) --outdir=generated --customdir=$(srcdir) --assembly-name=$(ASSEMBLY_NAME) \ + && touch generated-stamp + +$(ASSEMBLY): $(build_sources) generated-stamp $(srcdir)/$(ASSEMBLY_NAME).snk + $(CSC) -unsafe /out:$(ASSEMBLY) /target:library $(references) \ + -keyfile:$(srcdir)/$(ASSEMBLY_NAME).snk $(build_sources) generated/*.cs + $(GAPI_CDECL_INSERT) + sn -q -R $(ASSEMBLY) $(srcdir)/$(SNK) + +install-data-local: + @if test -n '$(TARGET)'; then \ + if test -n '$(DESTDIR)'; then \ + echo "$(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_DESTDIR_FLAGS)"; \ + $(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_DESTDIR_FLAGS) || exit 1; \ + else \ + echo "$(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_FLAGS)"; \ + $(GACUTIL) -i $(ASSEMBLY) -f $(GACUTIL_FLAGS) || exit 1; \ + fi; \ + fi + +uninstall-local: + @if test -n '$(TARGET)'; then \ + if test -n '$(DESTDIR)'; then \ + echo "$(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_DESTDIR_FLAGS)"; \ + $(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_DESTDIR_FLAGS) || exit 1; \ + else \ + echo "$(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS)"; \ + $(GACUTIL) -u $(ASSEMBLY_NAME) $(GACUTIL_FLAGS) || exit 1; \ + fi; \ + fi + +parse: + $(GAPI_PARSER) $(SOURCES_XML) + +# 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/mono/Message.custom b/mono/Message.custom new file mode 100644 index 0000000..573f38f --- /dev/null +++ b/mono/Message.custom @@ -0,0 +1,87 @@ + [DllImport ("gmime")] + static extern IntPtr g_mime_message_get_recipients (IntPtr message, int type); + + public InternetAddressList GetRecipients (GMime.RecipientType type) + { + IntPtr list = g_mime_message_get_recipients (Handle, (int) type); + + return new InternetAddressList (list); + } + + public InternetAddressList To { + get { return GetRecipients (RecipientType.To); } + } + + public InternetAddressList Cc { + get { return GetRecipients (RecipientType.Cc); } + } + + public InternetAddressList Bcc { + get { return GetRecipients (RecipientType.Bcc); } + } + + public System.Collections.IEnumerable References { + get { + GMime.HeaderList headers = HeaderList; + + if (headers == null) + yield break; + + string references = headers["References"]; + + if (references == null) + yield break; + + GMime.References refs = GMime.References.Parse (references); + GMime.References iter = refs; + + while (iter != null) { + yield return iter; + iter = iter.Next; + } + + yield break; + } + } + + [DllImport("gmime")] + static extern IntPtr internet_address_list_to_string (IntPtr list, bool encode); + + public string GetRecipientsAsString (GMime.RecipientType type, bool encode) + { + IntPtr list = g_mime_message_get_recipients (Handle, (int) type); + IntPtr str; + + if (list == IntPtr.Zero) + return null; + + str = internet_address_list_to_string (list, encode); + + return GLib.Marshaller.PtrToStringGFree (str); + } + + public string GetRecipientsAsString (GMime.RecipientType type) + { + return GetRecipientsAsString (type, false); + } + + [DllImport("gmime")] + static extern void g_mime_message_get_date (IntPtr message, out IntPtr date, out int gmt_offset); + + [DllImport("gmime")] + static extern void g_mime_message_set_date (IntPtr message, IntPtr date, int gmt_offset); + + public DateTime Date { + get { + int tz_offset; + IntPtr date; + + g_mime_message_get_date (Handle, out date, out tz_offset); + + return GLib.Marshaller.time_tToDateTime (date); + } + + set { + g_mime_message_set_date (Handle, GLib.Marshaller.DateTimeTotime_t (value), 0); + } + } diff --git a/mono/Multipart.custom b/mono/Multipart.custom new file mode 100644 index 0000000..aef29ec --- /dev/null +++ b/mono/Multipart.custom @@ -0,0 +1,248 @@ +#region Native Methods + [DllImport("gmime")] + static extern int g_mime_multipart_get_count (IntPtr multipart); + + [DllImport("gmime")] + static extern void g_mime_multipart_clear (IntPtr multipart); + + [DllImport("gmime")] + static extern int g_mime_multipart_add (IntPtr multipart, IntPtr part); + + [DllImport("gmime")] + static extern void g_mime_multipart_insert (IntPtr multipart, int index, IntPtr part); + + [DllImport("gmime")] + static extern bool g_mime_multipart_remove (IntPtr multipart, IntPtr part); + + [DllImport("gmime")] + static extern bool g_mime_multipart_remove_at (IntPtr multipart, int index); + + [DllImport("gmime")] + static extern bool g_mime_multipart_contains (IntPtr multipart, IntPtr part); + + [DllImport("gmime")] + static extern int g_mime_multipart_index_of (IntPtr multipart, IntPtr part); + + [DllImport("gmime")] + static extern IntPtr g_mime_multipart_get_part (IntPtr multipart, int index); +#endregion + + Exception CannotAdd (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot add objects of type '{0}' to a GMime.Multipart.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotInsert (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot insert objects of type '{0}' into a GMime.Multipart.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotRemove (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot remove objects of type '{0}' from a GMime.Multipart.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotSet (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot set objects of type '{0}' on a GMime.Multipart.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + public int Count { + get { return g_mime_multipart_get_count (Handle); } + } + + public bool IsFixedSize { + get { return false; } + } + + public bool IsReadOnly { + get { return false; } + } + + public bool IsSynchronized { + get { return false; } + } + + public object SyncRoot { + get { return this; } + } + + public int Add (GMime.Entity part) + { + if (part == null) + throw CannotAdd (part); + + return g_mime_multipart_add (Handle, part.Handle); + } + + int IList.Add (object value) + { + GMime.Entity part = value as GMime.Entity; + + if (part == null) + throw CannotAdd (value); + + return Add (part); + } + + public void Clear () + { + g_mime_multipart_clear (Handle); + } + + public bool Contains (GMime.Entity part) + { + if (part == null) + return false; + + return g_mime_multipart_contains (Handle, part.Handle); + } + + bool IList.Contains (object value) + { + return Contains (value as GMime.Entity); + } + + public void CopyTo (Array array, int index) + { + if (array == null) + throw new ArgumentNullException ("array"); + + if (index < 0) + throw new ArgumentOutOfRangeException ("index"); + + int n = Count; + + for (int i = 0; i < n; i++) + array.SetValue (((IList) this)[i], index + i); + } + + public IEnumerator GetEnumerator () + { + int n = Count; + + for (int i = 0; i < n; i++) + yield return this[i]; + + yield break; + } + + public int IndexOf (GMime.Entity part) + { + if (part == null) + return -1; + + return g_mime_multipart_index_of (Handle, part.Handle); + } + + int IList.IndexOf (object value) + { + return IndexOf (value as GMime.Entity); + } + + public void Insert (int index, GMime.Entity part) + { + if (part == null) + throw CannotInsert (part); + + if (index < 0) + throw new ArgumentOutOfRangeException ("index"); + + g_mime_multipart_insert (Handle, index, part.Handle); + } + + void IList.Insert (int index, object value) + { + GMime.Entity part = value as GMime.Entity; + + if (part == null) + throw CannotInsert (value); + + Insert (index, part); + } + + public void Remove (GMime.Entity part) + { + if (part == null) + throw CannotRemove (part); + + g_mime_multipart_remove (Handle, part.Handle); + } + + void IList.Remove (object value) + { + GMime.Entity part = value as GMime.Entity; + + if (part == null) + throw CannotRemove (value); + + Remove (part); + } + + public void RemoveAt (int index) + { + if (index < 0 || index >= Count) + throw new ArgumentOutOfRangeException ("index"); + + g_mime_multipart_remove_at (Handle, index); + } + + public GMime.Entity this[int index] { + get { + IntPtr raw = g_mime_multipart_get_part (Handle, index); + + if (raw == IntPtr.Zero) + return null; + + return GLib.Object.GetObject (raw) as GMime.Entity; + } + + set { + if (value == null) + throw CannotSet (value); + + if (index > Count || index < Count) + throw new ArgumentOutOfRangeException ("index"); + + if (index < Count) { + RemoveAt (index); + Insert (index, value); + } else { + Add (value); + } + } + } + + object IList.this[int index] { + get { + return this[index]; + } + + set { + this[index] = value as GMime.Entity; + } + } diff --git a/mono/Object.custom b/mono/Object.custom new file mode 100644 index 0000000..259b6ff --- /dev/null +++ b/mono/Object.custom @@ -0,0 +1,8 @@ +public StreamWrapper Stream { + get { + GMime.StreamMem mem_stream = new GMime.StreamMem (); + this.WriteToStream (mem_stream); + mem_stream.Seek (0); + return new StreamWrapper (mem_stream); + } +} diff --git a/mono/SignatureCollection.custom b/mono/SignatureCollection.custom new file mode 100644 index 0000000..332cadc --- /dev/null +++ b/mono/SignatureCollection.custom @@ -0,0 +1,243 @@ +#region Native Methods + [DllImport("gmime")] + static extern int g_mime_signature_list_length (IntPtr list); + + [DllImport("gmime")] + static extern void g_mime_signature_list_clear (IntPtr list); + + [DllImport("gmime")] + static extern int g_mime_signature_list_add (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern void g_mime_signature_list_insert (IntPtr list, int index, IntPtr ia); + + [DllImport("gmime")] + static extern bool g_mime_signature_list_remove (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern bool g_mime_signature_list_remove_at (IntPtr list, int index); + + [DllImport("gmime")] + static extern bool g_mime_signature_list_contains (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern int g_mime_signature_list_index_of (IntPtr list, IntPtr ia); + + [DllImport("gmime")] + static extern IntPtr g_mime_signature_list_get_signature (IntPtr list, int index); + + [DllImport("gmime")] + static extern void g_mime_signature_list_set_signature (IntPtr list, int index, IntPtr ia); +#endregion + + Exception CannotAdd (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot add objects of type '{0}' to a SignatureCollection.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotInsert (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot insert objects of type '{0}' into a SignatureCollection.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotRemove (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot remove objects of type '{0}' from a SignatureCollection.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + Exception CannotSet (object value) + { + if (value == null) + return new ArgumentNullException ("value"); + + string message = String.Format ("Cannot set objects of type '{0}' on an SignatureCollection.", + value.GetType ().ToString ()); + + return new InvalidOperationException (message); + } + + public int Count { + get { return g_mime_signature_list_length (Handle); } + } + + public bool IsFixedSize { + get { return false; } + } + + public bool IsReadOnly { + get { return false; } + } + + public bool IsSynchronized { + get { return false; } + } + + public object SyncRoot { + get { return this; } + } + + public int Add (Signature signature) + { + if (signature == null) + throw CannotAdd (signature); + + return g_mime_signature_list_add (Handle, signature.Handle); + } + + int IList.Add (object value) + { + Signature signature = value as Signature; + + if (signature == null) + throw CannotAdd (value); + + return Add (signature); + } + + public void Clear () + { + g_mime_signature_list_clear (Handle); + } + + public bool Contains (Signature signature) + { + if (signature == null) + return false; + + return g_mime_signature_list_contains (Handle, signature.Handle); + } + + bool IList.Contains (object value) + { + return Contains (value as Signature); + } + + public void CopyTo (Array array, int index) + { + if (array == null) + throw new ArgumentNullException ("array"); + + if (index < 0) + throw new ArgumentOutOfRangeException ("index"); + + int n = Count; + + for (int i = 0; i < n; i++) + array.SetValue (((IList) this)[i], index + i); + } + + public IEnumerator GetEnumerator () + { + int n = Count; + + for (int i = 0; i < n; i++) + yield return this[i]; + + yield break; + } + + public int IndexOf (Signature signature) + { + if (signature == null) + return -1; + + return g_mime_signature_list_index_of (Handle, signature.Handle); + } + + int IList.IndexOf (object value) + { + return IndexOf (value as Signature); + } + + public void Insert (int index, Signature signature) + { + if (signature == null) + throw CannotInsert (signature); + + if (index < 0) + throw new ArgumentOutOfRangeException ("index"); + + g_mime_signature_list_insert (Handle, index, signature.Handle); + } + + void IList.Insert (int index, object value) + { + Signature signature = value as Signature; + + if (signature == null) + throw CannotInsert (value); + + Insert (index, signature); + } + + public void Remove (Signature signature) + { + if (signature == null) + throw CannotRemove (signature); + + g_mime_signature_list_remove (Handle, signature.Handle); + } + + void IList.Remove (object value) + { + Signature signature = value as Signature; + + if (signature == null) + throw CannotRemove (value); + + Remove (signature); + } + + public void RemoveAt (int index) + { + if (index < 0 || index >= Count) + throw new ArgumentOutOfRangeException ("index"); + + g_mime_signature_list_remove_at (Handle, index); + } + + public Signature this[int index] { + get { + IntPtr raw = g_mime_signature_list_get_signature (Handle, index); + + if (raw == IntPtr.Zero) + return null; + + return GLib.Object.GetObject (raw) as Signature; + } + + set { + if (value == null) + throw CannotSet (value); + + g_mime_signature_list_set_signature (Handle, index, value.Handle); + } + } + + object IList.this[int index] { + get { + return this[index]; + } + + set { + this[index] = value as Signature; + } + } diff --git a/mono/Stream.custom b/mono/Stream.custom new file mode 100644 index 0000000..0ab4173 --- /dev/null +++ b/mono/Stream.custom @@ -0,0 +1,4 @@ +public long Seek (long offset) +{ + return this.Seek (offset, GMime.SeekWhence.Set); +} diff --git a/mono/StreamWrapper.cs b/mono/StreamWrapper.cs new file mode 100644 index 0000000..e393a2d --- /dev/null +++ b/mono/StreamWrapper.cs @@ -0,0 +1,187 @@ +using System; +using System.IO; + +namespace GMime { + public class StreamWrapper : System.IO.Stream, IDisposable { + GMime.Stream stream; + + public StreamWrapper (GMime.Stream stream) + { + if (stream == null) + throw new ArgumentNullException (); + + this.stream = stream; + } + + ~StreamWrapper () + { + Close (); + } + + public new void Dispose () + { + Close (); + } + + public GMime.Stream GMimeStream { + get { return stream; } + set { + if (value == null) + throw new ArgumentNullException (); + + stream = value; + } + } + + public override bool CanRead { + get { return stream == null ? false : true; } + } + + public override bool CanSeek { + get { return stream == null || stream is StreamFilter ? false : true; } + } + + public override bool CanWrite { + get { return stream == null ? false : true; } + } + + public override long Length { + get { + if (stream == null) + throw new ObjectDisposedException ("GMimeStream", "The stream has been closed"); + + return stream.Length; + } + } + + public override long Position { + get { + if (stream == null) + throw new ObjectDisposedException ("GMimeStream", "The stream has been closed"); + + return stream.Tell (); + } + + set { + if (Seek (value, SeekOrigin.Begin) == -1) + throw new IOException (); + } + } + + public override void Close () + { + if (stream == null) + throw new ObjectDisposedException ("GMimeStream", "The stream has been closed"); + + stream.Dispose (); + stream = null; + } + + public override void Flush () + { + stream.Flush (); + } + + public override int Read (byte[] buffer, int offset, int count) + { + byte[] buf; + int nread; + + if (stream == null) + throw new ObjectDisposedException ("GMimeStream", "The backing stream has been closed."); + + if (offset > buffer.Length) + throw new ArgumentOutOfRangeException ("offset"); + + if (offset + count > buffer.Length) + throw new ArgumentOutOfRangeException ("count"); + + if (offset != 0) + buf = new byte [count]; + else + buf = buffer; + + nread = (int) stream.Read (buf, (uint) count); + + if (nread < 0) + throw new IOException (); + + if (buf != buffer && nread > 0) + Array.Copy (buf, 0, buffer, offset, nread); + + return nread; + } + + public override void Write (byte[] buffer, int offset, int count) + { + int nwritten; + byte[] buf; + + if (stream == null) + throw new ObjectDisposedException ("GMimeStream", "The backing stream has been closed."); + + if (offset > buffer.Length) + throw new ArgumentOutOfRangeException ("offset"); + + if (offset + count > buffer.Length) + throw new ArgumentOutOfRangeException ("count"); + + if (offset != 0) { + buf = new byte [count]; + Array.Copy (buffer, offset, buf, 0, count); + } else { + buf = buffer; + } + + nwritten = (int) stream.Write (buf, (uint) count); + + if (nwritten < 0) + throw new IOException (); + } + + public override long Seek (long offset, SeekOrigin origin) + { + if (stream == null) + throw new ObjectDisposedException ("GMimeStream", "The backing stream has been closed."); + + if (stream is StreamFilter) { + if (offset != 0 || origin != SeekOrigin.Begin) + throw new NotSupportedException (); + + // offset = 0 is a special case and means reset the streamfilter + ((StreamFilter) stream).Reset (); + return 0; + } + + long ret = -1; + + switch (origin) { + case SeekOrigin.Begin: + if (offset < 0) + throw new ArgumentOutOfRangeException (); + + ret = stream.Seek (offset, GMime.SeekWhence.Set); + break; + case SeekOrigin.Current: + ret = stream.Seek (offset, GMime.SeekWhence.Cur); + break; + case SeekOrigin.End: + if (offset > 0) + throw new ArgumentOutOfRangeException (); + + ret = stream.Seek (offset, GMime.SeekWhence.End); + break; + } + + if (ret == -1) + throw new IOException (); + + return ret; + } + + public override void SetLength (long value) + { + throw new NotSupportedException (); + } + } +} diff --git a/mono/gmime-api.raw b/mono/gmime-api.raw new file mode 100644 index 0000000..a906d8b --- /dev/null +++ b/mono/gmime-api.raw @@ -0,0 +1,3267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mono/gmime-sharp.dll.config.in b/mono/gmime-sharp.dll.config.in new file mode 100644 index 0000000..3285df4 --- /dev/null +++ b/mono/gmime-sharp.dll.config.in @@ -0,0 +1,3 @@ + + + diff --git a/mono/gmime-sharp.pc.in b/mono/gmime-sharp.pc.in new file mode 100644 index 0000000..ca9fc1c --- /dev/null +++ b/mono/gmime-sharp.pc.in @@ -0,0 +1,11 @@ +prefix=${pcfiledir}/../.. +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +gapidir=${prefix}/share/gapi-2.0 + +Name: gmime-sharp +Version: @VERSION@ +Description: .NET bindings for GMime +Cflags: -I:${gapidir}/gmime-api.xml +Libs: -r:${libdir}/mono/gmime-sharp-@GMIME_API_VERSION@/gmime-sharp.dll +Requires: glib-sharp-2.0 diff --git a/mono/gmime-sharp.snk b/mono/gmime-sharp.snk new file mode 100644 index 0000000000000000000000000000000000000000..5c62e8ca3a3363e3a0d3858d4265c2e7a8dc64ec GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONaL0000xt)K1>GW9)=FBhetcl4*{*+x|MWs$Pf z{W@jmKO}8D+*XxKp>uMo)*q}boL#SA`3QsE#~}1Af%86)aipbDM^>C zU>CVoyf=n|c@w%X+%i`4b{24Xq;)p}?}J$o#sSQqcrga7OZyaSJZ9YA%Q#t#?Cdg5~fri06oc@O2Q*UH--GwHyNgDZhfUbf;;1@4AI# zF(eHkw?>>fl*zFa)AU+1Z8nRK>QjHQ4<(;bz<;YvVW1w@&+}5V3CDijbTS$#bNh2Xp+Yku`?R`8n?NC40rDV7#)VNn0RzFhKWr+{ zDu%zO$Y7ZP!u-j8t!?vRMxQBY)!uYu8+xc}>6FsubO-gV)F*o|3>O_=voW)2#bcYc z` i%SUh$3z5Prv|AfoE$|h*+jF+Na|(nET(cUnoy + + + + ../gmime + + + + diff --git a/packaging/gmime.spec b/packaging/gmime.spec new file mode 100644 index 0000000..4f7f461 --- /dev/null +++ b/packaging/gmime.spec @@ -0,0 +1,90 @@ +# Note that this is NOT a relocatable package +%define ver 2.6.15 +%define enable_mono 0 +%define enable_gtk_doc 0 + +%if %{enable_mono} +%define mono_configure_flags --enable-mono +%else +%define mono_configure_flags --disable-mono +%endif + +%if %{enable_gtk_doc} +%define gtkdoc_configure_flags --enable-gtk-doc +%else +%define gtkdoc_configure_flags --disable-gtk-doc +%endif + +Summary: MIME library +Name: gmime +Version: %ver +Release: 2 +License: LGPL-2.1+ +Group: Development/Libraries +URL: http://spruce.sourceforge.net/gmime/ + +Source: gmime-%{version}.tar.bz2 + +Requires: glib2 >= 2.12.0 +BuildRequires: glib2-devel >= 2.12.0 +BuildRequires: pkgconfig(glib-2.0) +BuildRequires: pkgconfig(gio-2.0) +BuildRequires: pkgconfig(zlib) + +%description +GMime is a set of utilities for parsing and creating messages using +the Multipurpose Internet Mail Extension (MIME) + +%package devel +Summary: GMime Development package +Group: Development/Libraries +Requires: %{name} = %{version}-%{release} + +%description devel +GMime Development package + +%prep +%setup + +%build +if [ ! -f configure ]; then + CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh $ARCHFLAG %{config_opts} %{mono_configure_flags} +fi +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix} %{mono_configure_flags} --libdir=%{_libdir} +make + +%install +rm -rf %{buildroot} +make install DESTDIR=%{buildroot} + +mkdir -p %{buildroot}/usr/share/license/gmime +cp -p ./COPYING %{buildroot}/usr/share/license/gmime/COPYING +# rename to prevent conflict with uu* utils from sharutils +#mv %{buildroot}%{_prefix}/bin/uuencode %{buildroot}%{_prefix}/bin/gmime-uuencode +#mv %{buildroot}%{_prefix}/bin/uudecode %{buildroot}%{_prefix}/bin/gmime-uudecode + +%clean +rm -rf %{buildroot} + +%files +%defattr(-, root, root) + +#%doc doc/html/* AUTHORS ChangeLog NEWS README COPYING TODO +#%{_prefix}/bin/* +#%{_prefix}/lib/*.sh +%{_libdir}/libgmime* +%{_prefix}/share/license/gmime/* +%exclude %{_libdir}/*.a +%exclude %{_libdir}/*.la + + +%files devel +%{_includedir}/gmime-2.6/gmime/*.h +%{_libdir}/libgmime* +%{_libdir}/pkgconfig/*.pc +%exclude %{_libdir}/*.a +%exclude %{_libdir}/*.la + +%changelog +* Mon Jun 17 2013 Minsoo Kim +- Modify .spec for Tizen diff --git a/tools/Makefile.am b/tools/Makefile.am new file mode 100644 index 0000000..b88d638 --- /dev/null +++ b/tools/Makefile.am @@ -0,0 +1,5 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = . + +EXTRA_DIST = gmime-port-2-2-to-2-4.sh gmime-port-2-4-to-2-6.sh diff --git a/tools/Makefile.in b/tools/Makefile.in new file mode 100644 index 0000000..ca3488c --- /dev/null +++ b/tools/Makefile.in @@ -0,0 +1,624 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = tools +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +API_VERSION = @API_VERSION@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSC = @CSC@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GACUTIL = @GACUTIL@ +GAPI_CODEGEN = @GAPI_CODEGEN@ +GAPI_FIXUP = @GAPI_FIXUP@ +GAPI_PARSER = @GAPI_PARSER@ +GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@ +GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@ +GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TAR = @TAR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gacdir = @gacdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . +EXTRA_DIST = gmime-port-2-2-to-2-4.sh gmime-port-2-4-to-2-6.sh +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tools/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# 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): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + 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; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + 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; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +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; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$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; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + 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; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$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_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + 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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-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/tools/gmime-port-2-2-to-2-4.sh b/tools/gmime-port-2-2-to-2-4.sh new file mode 100755 index 0000000..3eda468 --- /dev/null +++ b/tools/gmime-port-2-2-to-2-4.sh @@ -0,0 +1,118 @@ +#!/bin/bash + +for src in `find . -name "*.[c,h]"` +do + echo "Auto-porting '$src' from GMime-2.2 to GMime-2.4..." + sed -e "s/GMIME_INIT_FLAG_UTF8/0/g" \ + -e "s/GMimeDisposition/GMimeContentDisposition/g" \ + -e "s/GMimePartEncodingType/GMimeContentEncoding/g" \ + -e "s/GMIME_PART_ENCODING_/GMIME_CONTENT_ENCODING_/g" \ + -e "s/GMIME_FILTER_CRLF_ENCODE/TRUE/g" \ + -e "s/GMIME_FILTER_CRLF_DECODE/FALSE/g" \ + -e "s/GMIME_FILTER_CRLF_MODE_CRLF_DOTS/TRUE/g" \ + -e "s/GMIME_FILTER_CRLF_MODE_CRLF_ONLY/FALSE/g" \ + -e "s/GMIME_FILTER_YENC_DIRECTION_ENCODE/TRUE/g" \ + -e "s/GMIME_FILTER_YENC_DIRECTION_DECODE/FALSE/g" \ + -e "s/GMIME_FILTER_BASIC_BASE64_ENC/GMIME_CONTENT_ENCODING_BASE64, TRUE/g" \ + -e "s/GMIME_FILTER_BASIC_BASE64_DEC/GMIME_CONTENT_ENCODING_BASE64, FALSE/g" \ + -e "s/GMIME_FILTER_BASIC_QP_ENC/GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE, TRUE/g" \ + -e "s/GMIME_FILTER_BASIC_QP_DEC/GMIME_CONTENT_ENCODING_QUOTEDPRINTABLE, FALSE/g" \ + -e "s/GMIME_FILTER_BASIC_UU_ENC/GMIME_CONTENT_ENCODING_UUENCODE, TRUE/g" \ + -e "s/GMIME_FILTER_BASIC_UU_DEC/GMIME_CONTENT_ENCODING_UUENCODE, FALSE/g" \ + -e "s/g_mime_stream_filter_new_with_stream/g_mime_stream_filter_new/g" \ + -e "s/g_mime_filter_basic_new_type/g_mime_filter_basic_new/g" \ + -e "s/g_mime_object_add_header/g_mime_object_append_header/g" \ + -e "s/g_mime_header_register_writer/g_mime_header_list_register_writer/g" \ + -e "s/g_mime_header_write_to_stream/g_mime_header_list_write_to_stream/g" \ + -e "s/g_mime_header_to_string/g_mime_header_list_to_string/g" \ + -e "s/g_mime_header_destroy/g_mime_header_list_destroy/g" \ + -e "s/g_mime_header_prepend/g_mime_header_list_prepend/g" \ + -e "s/g_mime_header_remove/g_mime_header_list_remove/g" \ + -e "s/g_mime_header_add/g_mime_header_list_append/g" \ + -e "s/g_mime_header_get/g_mime_header_list_get/g" \ + -e "s/g_mime_header_set/g_mime_header_list_set/g" \ + -e "s/g_mime_header_new/g_mime_header_list_new/g" \ + -e "s/g_mime_header_foreach/g_mime_header_list_foreach/g" \ + -e "s/g_mime_message_get_headers/g_mime_object_get_headers/g" \ + -e "s/g_mime_message_add_header/g_mime_object_append_header/g" \ + -e "s/g_mime_message_get_header/g_mime_object_get_header/g" \ + -e "s/g_mime_message_set_header/g_mime_object_set_header/g" \ + -e "s/g_mime_message_write_to_stream/g_mime_object_write_to_stream/g" \ + -e "s/g_mime_message_to_string/g_mime_object_to_string/g" \ + -e "s/g_mime_message_get_date_string/g_mime_message_get_date_as_string/g" \ + -e "s/g_mime_content_type_destroy/g_object_unref/g" \ + -e "s/g_mime_content_type_get_type/g_mime_content_type_get_media_type/g" \ + -e "s/g_mime_content_type_set_type/g_mime_content_type_set_media_type/g" \ + -e "s/g_mime_content_type_get_subtype/g_mime_content_type_get_media_subtype/g" \ + -e "s/g_mime_content_type_set_subtype/g_mime_content_type_set_media_subtype/g" \ + -e "s/GMimeDisposition/GMimeContentDisposition/g" \ + -e "s/g_mime_disposition_new/g_mime_content_disposition_new_from_string/g" \ + -e "s/g_mime_disposition_destroy/g_object_unref/g" \ + -e "s/g_mime_disposition_add_parameter/g_mime_content_disposition_set_parameter/g" \ + -e "s/g_mime_disposition_get_parameter/g_mime_content_disposition_get_parameter/g" \ + -e "s/g_mime_disposition_get/g_mime_content_disposition_get_disposition/g" \ + -e "s/g_mime_disposition_set/g_mime_content_disposition_set_disposition/g" \ + -e "s/g_mime_part_get_content_disposition_parameter/g_mime_object_get_content_disposition_parameter/g" \ + -e "s/g_mime_part_add_content_disposition_parameter/g_mime_object_set_content_disposition_parameter/g" \ + -e "s/g_mime_part_get_content_disposition_object/g_mime_object_get_content_disposition/g" \ + -e "s/g_mime_part_set_content_disposition_object/g_mime_object_set_content_disposition/g" \ + -e "s/g_mime_part_get_content_disposition/g_mime_object_get_disposition/g" \ + -e "s/g_mime_part_set_content_disposition/g_mime_object_set_disposition/g" \ + -e "s/g_mime_part_get_content_header/g_mime_object_get_header/g" \ + -e "s/g_mime_part_set_content_header/g_mime_object_set_header/g" \ + -e "s/g_mime_part_get_content_type/g_mime_object_get_content_type/g" \ + -e "s/g_mime_part_set_content_type/g_mime_object_set_content_type/g" \ + -e "s/g_mime_part_get_encoding/g_mime_part_get_content_encoding/g" \ + -e "s/g_mime_part_set_encoding/g_mime_part_set_content_encoding/g" \ + -e "s/g_mime_part_write_to_stream/g_mime_object_write_to_stream/g" \ + -e "s/g_mime_part_to_string/g_mime_object_to_string/g" \ + -e "s/g_mime_multipart_add_part/g_mime_multipart_add/g" \ + -e "s/g_mime_multipart_add_part_at/g_mime_multipart_insert/g" \ + -e "s/g_mime_multipart_remove_part/g_mime_multipart_remove/g" \ + -e "s/g_mime_multipart_remove_part_at/g_mime_multipart_remove_at/g" \ + -e "s/g_mime_multipart_get_number/g_mime_multipart_get_count/g" \ + -e "s/g_mime_utils_base64_encode_close/g_mime_encoding_base64_encode_close/g" \ + -e "s/g_mime_utils_base64_encode_step/g_mime_encoding_base64_encode_step/g" \ + -e "s/g_mime_utils_base64_decode_step/g_mime_encoding_base64_decode_step/g" \ + -e "s/g_mime_utils_quoted_encode_close/g_mime_encoding_quoted_encode_close/g" \ + -e "s/g_mime_utils_quoted_encode_step/g_mime_encoding_quoted_encode_step/g" \ + -e "s/g_mime_utils_quoted_decode_step/g_mime_encoding_quoted_decode_step/g" \ + -e "s/g_mime_utils_uuencode_close/g_mime_encoding_uuencode_close/g" \ + -e "s/g_mime_utils_uuencode_step/g_mime_encoding_uuencode_step/g" \ + -e "s/g_mime_utils_uudecode_step/g_mime_encoding_uudecode_step/g" \ + -e "s/g_mime_utils_8bit_header_encode_phrase/g_mime_utils_header_encode_phrase/g" \ + -e "s/g_mime_utils_8bit_header_encode/g_mime_utils_header_encode_text/g" \ + -e "s/g_mime_utils_8bit_header_decode/g_mime_utils_header_decode_text/g" \ + -e "s/g_mime_cipher_validity_free/g_mime_signature_validity_free/g" \ + -e "s/g_mime_cipher_validity_get_description/g_mime_signature_validity_get_details/g" \ + -e "s/g_mime_cipher_validity_set_description/g_mime_signature_validity_set_details/g" \ + -e "s/g_mime_cipher_hash_name/g_mime_cipher_context_hash_name/g" \ + -e "s/g_mime_cipher_hash_id/g_mime_cipher_context_hash_id/g" \ + -e "s/g_mime_cipher_sign/g_mime_cipher_context_sign/g" \ + -e "s/g_mime_cipher_verify/g_mime_cipher_context_verify/g" \ + -e "s/g_mime_cipher_encrypt/g_mime_cipher_context_encrypt/g" \ + -e "s/g_mime_cipher_decrypt/g_mime_cipher_context_decrypt/g" \ + -e "s/g_mime_cipher_import_keys/g_mime_cipher_context_import_keys/g" \ + -e "s/g_mime_cipher_export_keys/g_mime_cipher_context_export_keys/g" \ + -e "s/g_mime_object_unref/g_object_unref/g" \ + -e "s/g_mime_object_ref/g_object_ref/g" \ + -e "s/g_mime_stream_unref/g_object_unref/g" \ + -e "s/g_mime_stream_ref/g_object_ref/g" \ + -e "s/INTERNET_ADDRESS_NAME/INTERNET_ADDRESS_TYPE_MAILBOX/g" \ + -e "s/INTERNET_ADDRESS_GROUP/INTERNET_ADDRESS_TYPE_GROUP/g" \ + -e "s/internet_address_unref/g_object_unref/g" \ + -e "s/internet_address_ref/g_object_ref/g" \ + -e "s/internet_address_new_name/internet_address_mailbox_new/g" \ + -e "s/internet_address_get_addr/internet_address_mailbox_get_addr/g" \ + -e "s/internet_address_set_addr/internet_address_mailbox_set_addr/g" \ + -e "s/internet_address_new_group/internet_address_group_new/g" \ + -e "s/internet_address_get_members/internet_address_group_get_members/g" \ + -e "s/internet_address_set_group/internet_address_group_set_members/g" \ + -e "s/internet_address_add_member/internet_address_group_add_member/g" \ + -e "s/internet_address_parse_string/internet_address_list_parse_string/g" \ + -e "s/internet_address_list_append/internet_address_list_add/g" \ + -e "s/internet_address_list_concat/internet_address_list_append/g" \ + -e "s/internet_address_list_destroy/g_object_unref/g" \ + < "$src" > "$src.tmp" + mv "$src.tmp" "$src" +done diff --git a/tools/gmime-port-2-4-to-2-6.sh b/tools/gmime-port-2-4-to-2-6.sh new file mode 100755 index 0000000..3b032c0 --- /dev/null +++ b/tools/gmime-port-2-4-to-2-6.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +for src in `find . -name "*.[c,h]"` +do + echo "Auto-porting '$src' from GMime-2.4 to GMime-2.6..." + sed -e "s/GMIME_BEST_ENCODING_7BIT/GMIME_ENCODING_CONSTRAINT_7BIT/g" \ + -e "s/GMIME_BEST_ENCODING_8BIT/GMIME_ENCODING_CONSTRAINT_8BIT/g" \ + -e "s/GMIME_BEST_ENCODING_BINARY/GMIME_ENCODING_CONSTRAINT_BINARY/g" \ + -e "s/GMimeBestEncoding/GMimeEncodingConstraint/g" \ + -e "s/GMimeCryptoHash/GMimeDigestAlgo/g" \ + -e "s/GMIME_CRYPTO_HASH_/GMIME_DIGEST_ALGO_/g" \ + -e "s/GMimeCipherContext/GMimeCryptoContext/g" \ + -e "s/GMIME_CIPHER_CONTEXT/GMIME_CRYPTO_CONTEXT/g" \ + -e "s/GMIME_IS_CIPHER_CONTEXT/GMIME_IS_CRYPTO_CONTEXT/g" \ + -e "s/g_mime_cipher_context/g_mime_crypto_context/g" \ + -e "s/gmime-cipher-context.h/gmime-crypto-context.h/g" \ + -e "s/GMIME_TYPE_CIPHER_CONTEXT/GMIME_TYPE_CRYPTO_CONTEXT/g" \ + -e "s/GMimeSignatureValidity/GMimeSignatureList/g" \ + -e "s/g_mime_signature_validity_free/g_object_unref/g" \ + -e "s/GMimeSignerTrust/GMimeCertificateTrust/g" \ + -e "s/GMIME_SIGNER_TRUST_/GMIME_CERTIFICATE_TRUST_/g" \ + -e "s/GMimeSignerStatus/GMimeSignatureStatus/g" \ + -e "s/GMIME_SIGNER_STATUS_/GMIME_SIGNATURE_STATUS_/g" \ + -e "s/GMimeSignerError/GMimeSignatureError/g" \ + -e "s/GMIME_SIGNER_ERROR_/GMIME_SIGNATURE_ERROR_/g" \ + -e "s/GMimeSigner/GMimeSignature/g" \ + -e "s/g_mime_signer_get_fingerprint/g_mime_certificate_get_fingerprint/g" \ + -e "s/g_mime_signer_set_fingerprint/g_mime_certificate_set_fingerprint/g" \ + -e "s/g_mime_signer_get_created/g_mime_signature_get_created/g" \ + -e "s/g_mime_signer_set_created/g_mime_signature_set_created/g" \ + -e "s/g_mime_signer_get_expires/g_mime_signature_get_expires/g" \ + -e "s/g_mime_signer_set_expires/g_mime_signature_set_expires/g" \ + -e "s/g_mime_signer_get_key_id/g_mime_certificate_get_key_id/g" \ + -e "s/g_mime_signer_set_key_id/g_mime_certificate_set_key_id/g" \ + -e "s/g_mime_signer_get_status/g_mime_signature_get_status/g" \ + -e "s/g_mime_signer_set_status/g_mime_signature_set_status/g" \ + -e "s/g_mime_signer_get_errors/g_mime_signature_get_errors/g" \ + -e "s/g_mime_signer_set_errors/g_mime_signature_set_errors/g" \ + -e "s/g_mime_signer_get_name/g_mime_certificate_get_name/g" \ + -e "s/g_mime_signer_set_name/g_mime_certificate_set_name/g" \ + < "$src" > "$src.tmp" + mv "$src.tmp" "$src" +done diff --git a/util/Makefile.am b/util/Makefile.am new file mode 100644 index 0000000..ff7b7fb --- /dev/null +++ b/util/Makefile.am @@ -0,0 +1,24 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = . + +noinst_LTLIBRARIES = libgmime-util.la + +INCLUDES = -I$(top_srcdir) \ + $(VERSION_FLAGS) \ + -DG_LOG_DOMAIN=\"util\" \ + $(GMIME_CFLAGS) \ + $(GLIB_CFLAGS) + +libgmime-util_la_SOURCES = \ + cache.c \ + cache.h \ + gtrie.c \ + gtrie.h \ + list.c \ + list.h \ + md5-utils.c \ + md5-utils.h \ + url-scanner.c \ + url-scanner.h + diff --git a/util/Makefile.in b/util/Makefile.in new file mode 100644 index 0000000..cd03dc1 --- /dev/null +++ b/util/Makefile.in @@ -0,0 +1,709 @@ +# Makefile.in generated by automake 1.11.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = util +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libgmime-util_la_LIBADD = +am_libgmime-util_la_OBJECTS = cache.lo gtrie.lo list.lo md5-utils.lo \ + url-scanner.lo +libgmime-util_la_OBJECTS = $(am_libgmime-util_la_OBJECTS) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgmime-util_la_SOURCES) +DIST_SOURCES = $(libgmime-util_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +API_VERSION = @API_VERSION@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSC = @CSC@ +CYGPATH_W = @CYGPATH_W@ +DB2HTML = @DB2HTML@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOLT_BASH = @DOLT_BASH@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GACUTIL = @GACUTIL@ +GAPI_CODEGEN = @GAPI_CODEGEN@ +GAPI_FIXUP = @GAPI_FIXUP@ +GAPI_PARSER = @GAPI_PARSER@ +GAPI_TOOLS_CFLAGS = @GAPI_TOOLS_CFLAGS@ +GAPI_TOOLS_LIBS = @GAPI_TOOLS_LIBS@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_COMPILE_RESOURCES = @GLIB_COMPILE_RESOURCES@ +GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_MKENUMS = @GLIB_MKENUMS@ +GLIB_SHARP_CFLAGS = @GLIB_SHARP_CFLAGS@ +GLIB_SHARP_LIBS = @GLIB_SHARP_LIBS@ +GMIME_API_VERSION = @GMIME_API_VERSION@ +GMIME_BINARY_AGE = @GMIME_BINARY_AGE@ +GMIME_CFLAGS = @GMIME_CFLAGS@ +GMIME_INCLUDEDIR = @GMIME_INCLUDEDIR@ +GMIME_INTERFACE_AGE = @GMIME_INTERFACE_AGE@ +GMIME_LIBDIR = @GMIME_LIBDIR@ +GMIME_LIBS = @GMIME_LIBS@ +GMIME_LIBS_PRIVATE = @GMIME_LIBS_PRIVATE@ +GMIME_MAJOR_VERSION = @GMIME_MAJOR_VERSION@ +GMIME_MICRO_VERSION = @GMIME_MICRO_VERSION@ +GMIME_MINOR_VERSION = @GMIME_MINOR_VERSION@ +GMIME_VERSION = @GMIME_VERSION@ +GOBJECT_QUERY = @GOBJECT_QUERY@ +GPGME_CONFIG = @GPGME_CONFIG@ +GPGME_PTHREAD_CFLAGS = @GPGME_PTHREAD_CFLAGS@ +GPGME_PTHREAD_LIBS = @GPGME_PTHREAD_LIBS@ +GREP = @GREP@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ +GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ +GTKDOC_MKPDF = @GTKDOC_MKPDF@ +GTKDOC_REBASE = @GTKDOC_REBASE@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBICONV = @LIBICONV@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_EXE_MACHINE_FLAG = @LIB_EXE_MACHINE_FLAG@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTCOMPILE = @LTCOMPILE@ +LTCXXCOMPILE = @LTCXXCOMPILE@ +LTLIBICONV = @LTLIBICONV@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MV = @MV@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +RANLIB = @RANLIB@ +RM = @RM@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TAR = @TAR@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gacdir = @gacdir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +ms_librarian = @ms_librarian@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . +noinst_LTLIBRARIES = libgmime-util.la +INCLUDES = -I$(top_srcdir) \ + $(VERSION_FLAGS) \ + -DG_LOG_DOMAIN=\"util\" \ + $(GMIME_CFLAGS) \ + $(GLIB_CFLAGS) + +libgmime-util_la_SOURCES = \ + cache.c \ + cache.h \ + gtrie.c \ + gtrie.h \ + list.c \ + list.h \ + md5-utils.c \ + md5-utils.h \ + url-scanner.c \ + url-scanner.h + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign util/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign util/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgmime-util.la: $(libgmime-util_la_OBJECTS) $(libgmime-util_la_DEPENDENCIES) $(EXTRA_libgmime-util_la_DEPENDENCIES) + $(LINK) $(libgmime-util_la_OBJECTS) $(libgmime-util_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtrie.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5-utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/url-scanner.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# 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): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + 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; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + 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; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +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; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$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; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + 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; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$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_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) +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: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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 clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + clean-noinstLTLIBRARIES ctags ctags-recursive distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-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/util/cache.c b/util/cache.c new file mode 100644 index 0000000..1fc8a8d --- /dev/null +++ b/util/cache.c @@ -0,0 +1,128 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "cache.h" + + +static void +cache_node_free (gpointer node_data) +{ + CacheNode *node = (CacheNode *) node_data; + Cache *cache = node->cache; + + cache->free_node (node); + g_free (node->key); + + g_slice_free1 (cache->node_size, node); +} + + +Cache * +cache_new (CacheNodeExpireFunc expire, CacheNodeFreeFunc free_node, size_t node_size, size_t max_size) +{ + Cache *cache; + + cache = g_new (Cache, 1); + list_init (&cache->list); + cache->expire = expire; + cache->free_node = free_node; + cache->node_hash = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, cache_node_free); + cache->node_size = node_size; + cache->max_size = max_size; + cache->size = 0; + + return cache; +} + + +void +cache_free (Cache *cache) +{ + g_hash_table_destroy (cache->node_hash); + g_free (cache); +} + + +void +cache_expire_unused (Cache *cache) +{ + ListNode *node, *prev; + + node = cache->list.tailpred; + while (node->prev && cache->size > cache->max_size) { + prev = node->prev; + if (cache->expire (cache, (CacheNode *) node)) { + list_unlink (node); + g_hash_table_remove (cache->node_hash, ((CacheNode *) node)->key); + cache->size--; + } + node = prev; + } +} + +CacheNode * +cache_node_insert (Cache *cache, const char *key) +{ + CacheNode *node; + + cache->size++; + + if (cache->size > cache->max_size) + cache_expire_unused (cache); + + node = g_slice_alloc (cache->node_size); + node->key = g_strdup (key); + node->cache = cache; + + g_hash_table_insert (cache->node_hash, node->key, node); + list_prepend (&cache->list, (ListNode *) node); + + return node; +} + +CacheNode * +cache_node_lookup (Cache *cache, const char *key, gboolean use) +{ + CacheNode *node; + + node = g_hash_table_lookup (cache->node_hash, key); + if (node && use) { + list_unlink ((ListNode *) node); + list_prepend (&cache->list, (ListNode *) node); + } + + return node; +} + +void +cache_node_expire (CacheNode *node) +{ + Cache *cache; + + cache = node->cache; + list_unlink ((ListNode *) node); + g_hash_table_remove (cache->node_hash, node->key); + cache->size--; +} diff --git a/util/cache.h b/util/cache.h new file mode 100644 index 0000000..9180911 --- /dev/null +++ b/util/cache.h @@ -0,0 +1,68 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __CACHE_H__ +#define __CACHE_H__ + +#include + +#include + +#include + +G_BEGIN_DECLS + +typedef struct _Cache Cache; + +typedef struct { + ListNode node; + Cache *cache; + char *key; +} CacheNode; + +typedef gboolean (*CacheNodeExpireFunc) (Cache *cache, CacheNode *node); +typedef void (*CacheNodeFreeFunc) (CacheNode *node); + +struct _Cache { + List list; + size_t size; + size_t max_size; + size_t node_size; + GHashTable *node_hash; + CacheNodeExpireFunc expire; + CacheNodeFreeFunc free_node; +}; + + +G_GNUC_INTERNAL Cache *cache_new (CacheNodeExpireFunc expire, CacheNodeFreeFunc free_node, + size_t bucket_size, size_t max_cache_size); + +G_GNUC_INTERNAL void cache_free (Cache *cache); + +G_GNUC_INTERNAL CacheNode *cache_node_insert (Cache *cache, const char *key); +G_GNUC_INTERNAL CacheNode *cache_node_lookup (Cache *cache, const char *key, gboolean use); + +G_GNUC_INTERNAL void cache_expire_unused (Cache *cache); +G_GNUC_INTERNAL void cache_node_expire (CacheNode *node); + +G_END_DECLS + +#endif /* __CACHE_H__ */ diff --git a/util/gtrie.c b/util/gtrie.c new file mode 100644 index 0000000..eec5721 --- /dev/null +++ b/util/gtrie.c @@ -0,0 +1,511 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "gtrie.h" + +#ifdef ENABLE_WARNINGS +#define w(x) x +#else +#define w(x) +#endif /* ENABLE_WARNINGS */ + +#define d(x) + +struct _trie_state { + struct _trie_state *next; + struct _trie_state *fail; + struct _trie_match *match; + unsigned int final; + int id; +}; + +struct _trie_match { + struct _trie_match *next; + struct _trie_state *state; + gunichar c; +}; + +struct _GTrie { + struct _trie_state root; + GPtrArray *fail_states; + gboolean icase; +}; + +static void trie_match_free (struct _trie_match *match); +static void trie_state_free (struct _trie_state *state); + +static struct _trie_match * +trie_match_new (void) +{ + return g_slice_new (struct _trie_match); +} + +static void +trie_match_free (struct _trie_match *match) +{ + struct _trie_match *next; + + while (match) { + next = match->next; + trie_state_free (match->state); + g_slice_free (struct _trie_match, match); + match = next; + } +} + +static struct _trie_state * +trie_state_new (void) +{ + return g_slice_new (struct _trie_state); +} + +static void +trie_state_free (struct _trie_state *state) +{ + trie_match_free (state->match); + g_slice_free (struct _trie_state, state); +} + + +static inline gunichar +trie_utf8_getc (const char **in, size_t inlen) +{ + register const unsigned char *inptr = (const unsigned char *) *in; + const unsigned char *inend = inptr + inlen; + register unsigned char c, r; + register gunichar m, u = 0; + + if (inlen == 0) + return 0; + + r = *inptr++; + if (r < 0x80) { + *in = (const char *) inptr; + u = r; + } else if (r < 0xfe) { /* valid start char? */ + u = r; + m = 0x7f80; /* used to mask out the length bits */ + do { + if (inptr >= inend) + return 0; + + c = *inptr++; + if ((c & 0xc0) != 0x80) + goto error; + + u = (u << 6) | (c & 0x3f); + r <<= 1; + m <<= 5; + } while (r & 0x40); + + *in = (const char *) inptr; + + u &= ~m; + } else { + error: + *in = (*in) + 1; + u = 0xfffe; + } + + return u; +} + + +GTrie * +g_trie_new (gboolean icase) +{ + GTrie *trie; + + trie = g_new (GTrie, 1); + trie->root.next = NULL; + trie->root.fail = NULL; + trie->root.match = NULL; + trie->root.final = 0; + + trie->fail_states = g_ptr_array_new (); + trie->icase = icase; + + return trie; +} + + +void +g_trie_free (GTrie *trie) +{ + g_ptr_array_free (trie->fail_states, TRUE); + trie_match_free (trie->root.match); + g_free (trie); +} + + + +static struct _trie_match * +g (struct _trie_state *s, gunichar c) +{ + struct _trie_match *m = s->match; + + while (m && m->c != c) + m = m->next; + + return m; +} + +static struct _trie_state * +trie_insert (GTrie *trie, guint depth, struct _trie_state *q, gunichar c) +{ + struct _trie_match *m; + + m = trie_match_new (); + m->next = q->match; + m->c = c; + + q->match = m; + q = m->state = trie_state_new (); + q->match = NULL; + q->fail = &trie->root; + q->final = 0; + q->id = 0; + + if (trie->fail_states->len < depth + 1) { + unsigned int size = trie->fail_states->len; + + size = MAX (size + 64, depth + 1); + g_ptr_array_set_size (trie->fail_states, size); + } + + q->next = trie->fail_states->pdata[depth]; + trie->fail_states->pdata[depth] = q; + + return q; +} + + +#if d(!)0 +static void +dump_trie (struct _trie_state *s, int depth) +{ + char *p = g_alloca ((depth * 2) + 1); + struct _trie_match *m; + + memset (p, ' ', depth * 2); + p[depth * 2] = '\0'; + + fprintf (stderr, "%s[state] %p: final=%d; pattern-id=%s; fail=%p\n", + p, s, s->final, s->id, s->fail); + m = s->match; + while (m) { + fprintf (stderr, " %s'%c' -> %p\n", p, m->c, m->state); + if (m->state) + dump_trie (m->state, depth + 1); + + m = m->next; + } +} +#endif + + +/* + * final = empty set + * FOR p = 1 TO #pat + * q = root + * FOR j = 1 TO m[p] + * IF g(q, pat[p][j]) == null + * insert(q, pat[p][j]) + * ENDIF + * q = g(q, pat[p][j]) + * ENDFOR + * final = union(final, q) + * ENDFOR +*/ + +void +g_trie_add (GTrie *trie, const char *pattern, int pattern_id) +{ + const char *inptr = pattern; + struct _trie_state *q, *q1, *r; + struct _trie_match *m, *n; + guint i, depth = 0; + gunichar c; + + /* Step 1: add the pattern to the trie */ + + q = &trie->root; + + while ((c = trie_utf8_getc (&inptr, -1))) { + if (c == 0xfffe) { + w(g_warning ("Invalid UTF-8 sequence in pattern '%s' at %s", + pattern, (inptr - 1))); + continue; + } + + if (trie->icase) + c = g_unichar_tolower (c); + + m = g (q, c); + if (m == NULL) { + q = trie_insert (trie, depth, q, c); + } else { + q = m->state; + } + + depth++; + } + + q->final = depth; + q->id = pattern_id; + + /* Step 2: compute failure graph */ + + for (i = 0; i < trie->fail_states->len; i++) { + q = trie->fail_states->pdata[i]; + while (q) { + m = q->match; + while (m) { + c = m->c; + q1 = m->state; + r = q->fail; + while (r && (n = g (r, c)) == NULL) + r = r->fail; + + if (r != NULL) { + q1->fail = n->state; + if (q1->fail->final > q1->final) + q1->final = q1->fail->final; + } else { + if ((n = g (&trie->root, c))) + q1->fail = n->state; + else + q1->fail = &trie->root; + } + + m = m->next; + } + + q = q->next; + } + } + + d(fprintf (stderr, "\nafter adding pattern '%s' to trie %p:\n", pattern, trie)); + d(dump_trie (&trie->root, 0)); +} + +/* + * Aho-Corasick + * + * q = root + * FOR i = 1 TO n + * WHILE q != fail AND g(q, text[i]) == fail + * q = h(q) + * ENDWHILE + * IF q == fail + * q = root + * ELSE + * q = g(q, text[i]) + * ENDIF + * IF isElement(q, final) + * RETURN TRUE + * ENDIF + * ENDFOR + * RETURN FALSE + */ + +const char * +g_trie_quick_search (GTrie *trie, const char *buffer, size_t buflen, int *matched_id) +{ + const char *inptr, *inend, *prev, *pat; + register size_t inlen = buflen; + struct _trie_match *m = NULL; + struct _trie_state *q; + gunichar c; + + inend = buffer + buflen; + inptr = buffer; + + q = &trie->root; + pat = prev = inptr; + while ((c = trie_utf8_getc (&inptr, inlen))) { + inlen = (inend - inptr); + + if (c == 0xfffe) { +#ifdef ENABLE_WARNINGS + prev = (inptr - 1); + pat = buffer + buflen; + g_warning ("Invalid UTF-8 in buffer '%.*s' at %.*s", + buflen, buffer, pat - prev, prev); +#endif + + pat = prev = inptr; + } + + if (trie->icase) + c = g_unichar_tolower (c); + + while (q != NULL && (m = g (q, c)) == NULL) + q = q->fail; + + if (q == &trie->root) + pat = prev; + + if (q == NULL) { + q = &trie->root; + pat = inptr; + } else if (m != NULL) { + q = m->state; + + if (q->final) { + if (matched_id) + *matched_id = q->id; + + return pat; + } + } + + prev = inptr; + } + + return NULL; +} + +const char * +g_trie_search (GTrie *trie, const char *buffer, size_t buflen, int *matched_id) +{ + const char *inptr, *inend, *prev, *pat; + register size_t inlen = buflen; + struct _trie_match *m = NULL; + struct _trie_state *q; + size_t matched = 0; + gunichar c; + + inend = buffer + buflen; + inptr = buffer; + + q = &trie->root; + pat = prev = inptr; + while ((c = trie_utf8_getc (&inptr, inlen))) { + inlen = (inend - inptr); + + if (c == 0xfffe) { + if (matched) + return pat; + +#ifdef ENABLE_WARNINGS + prev = (inptr - 1); + pat = buffer + buflen; + g_warning ("Invalid UTF-8 in buffer '%.*s' at %.*s", + buflen, buffer, pat - prev, prev); +#endif + + pat = prev = inptr; + } + + if (trie->icase) + c = g_unichar_tolower (c); + + while (q != NULL && (m = g (q, c)) == NULL && matched == 0) + q = q->fail; + + if (q == &trie->root) { + if (matched) + return pat; + + pat = prev; + } + + if (q == NULL) { + if (matched) + return pat; + + q = &trie->root; + pat = inptr; + } else if (m != NULL) { + q = m->state; + + if (q->final > matched) { + if (matched_id) + *matched_id = q->id; + + matched = q->final; + } + } + + prev = inptr; + } + + return matched ? pat : NULL; +} + + +#ifdef TEST + +static char *patterns[] = { + "news://", + "nntp://", + "telnet://", + "file://", + "ftp://", + "http://", + "https://", + "www.", + "ftp.", + "mailto:", + "@" +}; + +static char *haystacks[] = { + "try this url: http://www.ximian.com", + "or, feel free to email me at fejj@ximian.com", + "don't forget to check out www.ximian.com", + "I've attached a file (file:///cvs/gmime/gmime/gtrie.c)", +}; + +int main (int argc, char **argv) +{ + const char *match; + GTrie *trie; + guint i; + int id; + + trie = g_trie_new (TRUE); + for (i = 0; i < G_N_ELEMENTS (patterns); i++) + g_trie_add (trie, patterns[i], i); + + for (i = 0; i < G_N_ELEMENTS (haystacks); i++) { + if ((match = g_trie_search (trie, haystacks[i], -1, &id))) { + fprintf (stderr, "matched @ '%s' with pattern '%s'\n", match, patterns[id]); + } else { + fprintf (stderr, "no match\n"); + } + } + + fflush (stdout); + + g_trie_free (trie); + + return match == NULL ? 0 : 1; +} +#endif /* TEST */ diff --git a/util/gtrie.h b/util/gtrie.h new file mode 100644 index 0000000..4331d5f --- /dev/null +++ b/util/gtrie.h @@ -0,0 +1,42 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __G_TRIE_H__ +#define __G_TRIE_H__ + +#include + +G_BEGIN_DECLS + +typedef struct _GTrie GTrie; + +GTrie *g_trie_new (gboolean icase); +void g_trie_free (GTrie *trie); + +void g_trie_add (GTrie *trie, const char *pattern, int pattern_id); + +const char *g_trie_quick_search (GTrie *trie, const char *buffer, size_t buflen, int *matched_id); + +const char *g_trie_search (GTrie *trie, const char *buffer, size_t buflen, int *matched_id); + +G_END_DECLS + +#endif /* __G_TRIE_H__ */ diff --git a/util/list.c b/util/list.c new file mode 100644 index 0000000..c27f695 --- /dev/null +++ b/util/list.c @@ -0,0 +1,118 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "list.h" + +void +list_init (List *list) +{ + list->head = (ListNode *) &list->tail; + list->tail = NULL; + list->tailpred = (ListNode *) &list->head; +} + +int +list_is_empty (List *list) +{ + return list->head == (ListNode *) &list->tail; +} + +int +list_length (List *list) +{ + ListNode *node; + int n = 0; + + node = list->head; + while (node->next) { + node = node->next; + n++; + } + + return n; +} + +ListNode * +list_unlink_head (List *list) +{ + ListNode *n, *nn; + + n = list->head; + nn = n->next; + if (nn) { + nn->prev = n->prev; + list->head = nn; + return n; + } + + return NULL; +} + +ListNode * +list_unlink_tail (List *list) +{ + ListNode *n, *np; + + n = list->tailpred; + np = n->prev; + if (np) { + np->next = n->next; + list->tailpred = np; + return n; + } + + return NULL; +} + +ListNode * +list_prepend (List *list, ListNode *node) +{ + node->next = list->head; + node->prev = (ListNode *) &list->head; + list->head->prev = node; + list->head = node; + + return node; +} + +ListNode * +list_append (List *list, ListNode *node) +{ + node->next = (ListNode *) &list->tail; + node->prev = list->tailpred; + list->tailpred->next = node; + list->tailpred = node; + + return node; +} + +ListNode * +list_unlink (ListNode *node) +{ + node->next->prev = node->prev; + node->prev->next = node->next; + + return node; +} diff --git a/util/list.h b/util/list.h new file mode 100644 index 0000000..2659bd8 --- /dev/null +++ b/util/list.h @@ -0,0 +1,59 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __LIST_H__ +#define __LIST_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct _ListNode { + struct _ListNode *next; + struct _ListNode *prev; +} ListNode; + +typedef struct { + ListNode *head; + ListNode *tail; + ListNode *tailpred; +} List; + +#define LIST_INITIALIZER(l) { (ListNode *) &l.tail, NULL, (ListNode *) &l.head } + +G_GNUC_INTERNAL void list_init (List *list); + +G_GNUC_INTERNAL int list_is_empty (List *list); + +G_GNUC_INTERNAL int list_length (List *list); + +G_GNUC_INTERNAL ListNode *list_unlink_head (List *list); +G_GNUC_INTERNAL ListNode *list_unlink_tail (List *list); + +G_GNUC_INTERNAL ListNode *list_prepend (List *list, ListNode *node); +G_GNUC_INTERNAL ListNode *list_append (List *list, ListNode *node); + +G_GNUC_INTERNAL ListNode *list_unlink (ListNode *node); + +G_END_DECLS + +#endif /* __LIST_H__ */ diff --git a/util/md5-utils.c b/util/md5-utils.c new file mode 100644 index 0000000..2b95af1 --- /dev/null +++ b/util/md5-utils.c @@ -0,0 +1,355 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to md5_init, call md5_update as + * needed on buffers full of bytes, and then call md5_Final, which + * will fill a supplied 16-byte array with the digest. + */ + +/* parts of this file are: + * Written March 1993 by Branko Lankester + * Modified June 1993 by Colin Plumb for altered md5.c. + * Modified October 1995 by Erik Troan for RPM + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include "md5-utils.h" + +#define d(x) + +static void md5_transform (guint32 buf[4], const guint32 in[16]); + +static int _ie = 0x44332211; +static union _endian { int i; char b[4]; } *_endian = (union _endian *) &_ie; +#define IS_BIG_ENDIAN() (_endian->b[0] == '\x44') +#define IS_LITTLE_ENDIAN() (_endian->b[0] == '\x11') + + +/* + * Note: this code is harmless on little-endian machines. + */ +static void +_byte_reverse (unsigned char *buf, guint32 longs) +{ + guint32 t; + + do { + t = (guint32) ((guint32) buf[3] << 8 | buf[2]) << 16 | + ((guint32) buf[1] << 8 | buf[0]); + *(guint32 *) buf = t; + buf += 4; + } while (--longs); +} + + +/** + * md5_init: Initialise an md5 context object + * @ctx: md5 context + * + * Initialise an md5 buffer. + * + **/ +void +md5_init (MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; + + if (IS_BIG_ENDIAN ()) + ctx->doByteReverse = 1; + else + ctx->doByteReverse = 0; +} + + +/** + * md5_update: add a buffer to md5 hash computation + * @ctx: conetxt object used for md5 computaion + * @buf: buffer to add + * @len: buffer length + * + * Update context to reflect the concatenation of another buffer full + * of bytes. Use this to progressively construct an md5 hash. + **/ +void +md5_update (MD5Context *ctx, const unsigned char *buf, guint32 len) +{ + guint32 t; + + /* Update bitcount */ + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((guint32) len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + if (t) { + unsigned char *p = (unsigned char *) ctx->in + t; + + t = 64 - t; + if (len < t) { + memcpy (p, buf, len); + return; + } + memcpy (p, buf, t); + if (ctx->doByteReverse) + _byte_reverse (ctx->in, 16); + md5_transform (ctx->buf, (guint32 *) ctx->in); + buf += t; + len -= t; + } + + /* Process data in 64-byte chunks */ + while (len >= 64) { + memcpy (ctx->in, buf, 64); + if (ctx->doByteReverse) + _byte_reverse (ctx->in, 16); + md5_transform (ctx->buf, (guint32 *) ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + memcpy (ctx->in, buf, len); +} + + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +/** + * md5_final: copy the final md5 hash to a bufer + * @digest: 16 bytes buffer + * @ctx: context containing the calculated md5 + * + * copy the final md5 hash to a bufer + **/ +void +md5_final (MD5Context *ctx, unsigned char digest[16]) +{ + guint32 count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset (p, 0, count); + if (ctx->doByteReverse) + _byte_reverse (ctx->in, 16); + md5_transform (ctx->buf, (guint32 *) ctx->in); + + /* Now fill the next block with 56 bytes */ + memset (ctx->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset (p, 0, count - 8); + } + + if (ctx->doByteReverse) + _byte_reverse (ctx->in, 14); + + /* Append length in bits and transform */ + ((guint32 *) ctx->in)[14] = ctx->bits[0]; + ((guint32 *) ctx->in)[15] = ctx->bits[1]; + + md5_transform (ctx->buf, (guint32 *) ctx->in); + if (ctx->doByteReverse) + _byte_reverse ((unsigned char *) ctx->buf, 4); + memcpy (digest, ctx->buf, 16); +} + + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. md5_Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void +md5_transform (guint32 buf[4], const guint32 in[16]) +{ + register guint32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + + +/** + * md5_get_digest: get the md5 hash of a buffer + * @buffer: byte buffer + * @buffer_size: buffer size (in bytes) + * @digest: 16 bytes buffer receiving the hash code. + * + * Get the md5 hash of a buffer. The result is put in + * the 16 bytes buffer @digest . + **/ +void +md5_get_digest (const char *buffer, unsigned int buffer_size, unsigned char digest[16]) +{ + MD5Context ctx; + + md5_init (&ctx); + md5_update (&ctx, (unsigned char *) buffer, buffer_size); + md5_final (&ctx, digest); +} + + +/** + * md5_get_digest_from_file: get the md5 hash of a file + * @filename: file name + * @digest: 16 bytes buffer receiving the hash code. + * + * Get the md5 hash of a file. The result is put in + * the 16 bytes buffer @digest . + **/ +void +md5_get_digest_from_file (const char *filename, unsigned char digest[16]) +{ + MD5Context ctx; + unsigned char buf[1024]; + size_t nread; + FILE *fp; + + d(fprintf (stderr, "generating checksum\n")); + + if (!(fp = fopen (filename, "rb"))) + return; + + md5_init (&ctx); + + while ((nread = fread (buf, 1, 1024, fp)) > 0) + md5_update (&ctx, buf, nread); + + if (ferror (fp)) { + fclose (fp); + return; + } + + md5_final (&ctx, digest); + + fclose (fp); + d(fprintf (stderr, "checksum done\n")); +} diff --git a/util/md5-utils.h b/util/md5-utils.h new file mode 100644 index 0000000..aec2383 --- /dev/null +++ b/util/md5-utils.h @@ -0,0 +1,54 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to rpmMD5Init, call rpmMD5Update as + * needed on buffers full of bytes, and then call rpmMD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +/* parts of this file are : + * Written March 1993 by Branko Lankester + * Modified June 1993 by Colin Plumb for altered md5.c. + * Modified October 1995 by Erik Troan for RPM + */ + + +#ifndef MD5_UTILS_H +#define MD5_UTILS_H + +#include + +G_BEGIN_DECLS + +typedef struct { + guint32 buf[4]; + guint32 bits[2]; + unsigned char in[64]; + int doByteReverse; +} MD5Context; + + +G_GNUC_INTERNAL void md5_get_digest (const char *buffer, unsigned int buffer_size, unsigned char digest[16]); + +/* use this one when speed is needed */ +/* for use in provider code only */ +G_GNUC_INTERNAL void md5_get_digest_from_file (const char *filename, unsigned char digest[16]); + +/* raw routines */ +G_GNUC_INTERNAL void md5_init (MD5Context *ctx); +G_GNUC_INTERNAL void md5_update (MD5Context *ctx, const unsigned char *buf, guint32 len); +G_GNUC_INTERNAL void md5_final (MD5Context *ctx, unsigned char digest[16]); + +G_END_DECLS + +#endif /* MD5_UTILS_H */ diff --git a/util/url-scanner.c b/util/url-scanner.c new file mode 100644 index 0000000..aeb7787 --- /dev/null +++ b/util/url-scanner.c @@ -0,0 +1,583 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "gtrie.h" +#include "url-scanner.h" + + +struct _UrlScanner { + GPtrArray *patterns; + GTrie *trie; +}; + + +UrlScanner * +url_scanner_new (void) +{ + UrlScanner *scanner; + + scanner = g_new (UrlScanner, 1); + scanner->patterns = g_ptr_array_new (); + scanner->trie = g_trie_new (TRUE); + + return scanner; +} + + +void +url_scanner_free (UrlScanner *scanner) +{ + g_return_if_fail (scanner != NULL); + + g_ptr_array_free (scanner->patterns, TRUE); + g_trie_free (scanner->trie); + g_free (scanner); +} + + +void +url_scanner_add (UrlScanner *scanner, urlpattern_t *pattern) +{ + g_return_if_fail (scanner != NULL); + + g_trie_add (scanner->trie, pattern->pattern, scanner->patterns->len); + g_ptr_array_add (scanner->patterns, pattern); +} + + +gboolean +url_scanner_scan (UrlScanner *scanner, const char *in, size_t inlen, urlmatch_t *match) +{ + const char *pos, *inend; + urlpattern_t *pat; + int pattern_id; + + g_return_val_if_fail (scanner != NULL, FALSE); + g_return_val_if_fail (in != NULL, FALSE); + + if (!(pos = g_trie_search (scanner->trie, in, inlen, &pattern_id))) + return FALSE; + + pat = g_ptr_array_index (scanner->patterns, pattern_id); + + match->pattern = pat->pattern; + match->prefix = pat->prefix; + + inend = in + inlen; + if (!pat->start (in, pos, inend, match)) + return FALSE; + + if (!pat->end (in, pos, inend, match)) + return FALSE; + + return TRUE; +} + + +static unsigned char url_scanner_table[256] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 1, 1, 9, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 24,128,160,128,128,128,128,128,160,160,128,128,160,192,160,160, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,160,160, 32,128, 32,128, + 160, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,160,160,160,128,128, + 128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66,128,128,128,128, 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, 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, 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, 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, 1 +}; + +enum { + IS_CTRL = (1 << 0), + IS_ALPHA = (1 << 1), + IS_DIGIT = (1 << 2), + IS_LWSP = (1 << 3), + IS_SPACE = (1 << 4), + IS_SPECIAL = (1 << 5), + IS_DOMAIN = (1 << 6), + IS_URLSAFE = (1 << 7), +}; + +#define is_ctrl(x) ((url_scanner_table[(unsigned char)(x)] & IS_CTRL) != 0) +#define is_lwsp(x) ((url_scanner_table[(unsigned char)(x)] & IS_LWSP) != 0) +#define is_atom(x) ((url_scanner_table[(unsigned char)(x)] & (IS_SPECIAL|IS_SPACE|IS_CTRL)) == 0) +#define is_alpha(x) ((url_scanner_table[(unsigned char)(x)] & IS_ALPHA) != 0) +#define is_digit(x) ((url_scanner_table[(unsigned char)(x)] & IS_DIGIT) != 0) +#define is_domain(x) ((url_scanner_table[(unsigned char)(x)] & IS_DOMAIN) != 0) +#define is_urlsafe(x) ((url_scanner_table[(unsigned char)(x)] & (IS_ALPHA|IS_DIGIT|IS_URLSAFE)) != 0) + +static struct { + char open; + char close; +} url_braces[] = { + { '(', ')' }, + { '{', '}' }, + { '[', ']' }, + { '<', '>' }, + { '|', '|' }, +}; + +static gboolean +is_open_brace (char c) +{ + int i; + + for (i = 0; i < G_N_ELEMENTS (url_braces); i++) { + if (c == url_braces[i].open) + return TRUE; + } + + return FALSE; +} + +static char +url_stop_at_brace (const char *in, size_t so) +{ + int i; + + if (so > 0) { + for (i = 0; i < 4; i++) { + if (in[so - 1] == url_braces[i].open) + return url_braces[i].close; + } + } + + return '\0'; +} + + +gboolean +url_addrspec_start (const char *in, const char *pos, const char *inend, urlmatch_t *match) +{ + register const char *inptr = pos; + + g_assert (*inptr == '@'); + + if (inptr == in) + return FALSE; + + inptr--; + + while (inptr > in) { + if (is_atom (*inptr)) + inptr--; + else + break; + + while (inptr > in && is_atom (*inptr)) + inptr--; + + if (inptr > in && *inptr == '.') + inptr--; + } + + if (!is_atom (*inptr) || is_open_brace (*inptr)) + inptr++; + + if (inptr == pos) + return FALSE; + + match->um_so = (inptr - in); + + return TRUE; +} + +gboolean +url_addrspec_end (const char *in, const char *pos, const char *inend, urlmatch_t *match) +{ + const char *inptr = pos; + int parts = 0, digits; + gboolean got_dot = FALSE; + + g_assert (*inptr == '@'); + + inptr++; + + if (*inptr == '[') { + /* domain literal */ + do { + inptr++; + + digits = 0; + while (inptr < inend && is_digit (*inptr) && digits < 3) { + inptr++; + digits++; + } + + parts++; + + if (*inptr != '.' && parts != 4) + return FALSE; + } while (parts < 4); + + if (inptr < inend && *inptr == ']') + inptr++; + else + return FALSE; + + got_dot = TRUE; + } else { + while (inptr < inend) { + if (is_domain (*inptr)) + inptr++; + else + break; + + while (inptr < inend && is_domain (*inptr)) + inptr++; + + if (inptr < inend && *inptr == '.' && is_domain (inptr[1])) { + if (*inptr == '.') + got_dot = TRUE; + inptr++; + } + } + } + + if (inptr == pos + 1 || !got_dot) + return FALSE; + + match->um_eo = (inptr - in); + + return TRUE; +} + + +gboolean +url_file_start (const char *in, const char *pos, const char *inend, urlmatch_t *match) +{ + match->um_so = (pos - in); + + return TRUE; +} + +gboolean +url_file_end (const char *in, const char *pos, const char *inend, urlmatch_t *match) +{ + register const char *inptr = pos; + char close_brace; + + inptr += strlen (match->pattern); + + if (*inptr == '/') + inptr++; + + close_brace = url_stop_at_brace (in, match->um_so); + + while (inptr < inend && is_urlsafe (*inptr) && *inptr != close_brace) + inptr++; + + if (inptr == pos) + return FALSE; + + match->um_eo = (inptr - in); + + return TRUE; +} + +gboolean +url_web_start (const char *in, const char *pos, const char *inend, urlmatch_t *match) +{ + match->um_so = (pos - in); + + return TRUE; +} + +gboolean +url_web_end (const char *in, const char *pos, const char *inend, urlmatch_t *match) +{ + register const char *inptr = pos; + gboolean openbracket = FALSE; + gboolean passwd = FALSE; + const char *save; + char close_brace; + int port, val, n; + char *end; + + inptr += strlen (match->pattern); + + close_brace = url_stop_at_brace (in, match->um_so); + + /* find the end of the domain */ + if (is_digit (*inptr)) { + goto ip_literal2; + } else if (is_atom (*inptr)) { + /* might be a domain or user@domain */ + save = inptr; + while (inptr < inend) { + if (!is_atom (*inptr)) + break; + + inptr++; + + while (inptr < inend && is_atom (*inptr)) + inptr++; + + if ((inptr + 1) < inend && *inptr == '.' && is_atom (inptr[1])) + inptr++; + } + + if (*inptr != '@') + inptr = save; + else + inptr++; + + if (*inptr == '[') { + /* IPv6 (or possibly IPv4) address literal */ + goto ip_literal; + } + + if (is_domain (*inptr)) { + /* domain name or IPv4 address */ + goto domain; + } + } else if (*inptr == '[') { + ip_literal: + openbracket = TRUE; + inptr++; + + if (is_digit (*inptr)) { + ip_literal2: + /* could be IPv4 or IPv6 */ + if ((val = strtol (inptr, &end, 10)) < 0) + return FALSE; + } else if ((*inptr >= 'A' && *inptr <= 'F') || (*inptr >= 'a' && *inptr <= 'f')) { + /* IPv6 address literals are in hex */ + if ((val = strtol (inptr, &end, 16)) < 0 || *end != ':') + return FALSE; + } else if (*inptr == ':') { + /* IPv6 can start with a ':' */ + end = (char *) inptr; + val = 256; /* invalid value */ + } else { + return FALSE; + } + + switch (*end) { + case '.': /* IPv4 address literal */ + n = 1; + do { + if (val > 255 || *end != '.') + return FALSE; + + inptr = end + 1; + if ((val = strtol (inptr, &end, 10)) < 0) + return FALSE; + + n++; + } while (n < 4); + + if (val > 255 || n < 4 || (openbracket && *end != ']')) + return FALSE; + + inptr = end + 1; + break; + case ':': /* IPv6 address literal */ + if (!openbracket) + return FALSE; + + do { + if (end[1] != ':') { + inptr = end + 1; + if ((val = strtol (inptr, &end, 16)) < 0) + return FALSE; + } else { + inptr = end; + end++; + } + } while (end > inptr && *end == ':'); + + if (*end != ']') + return FALSE; + + inptr = end + 1; + break; + default: + return FALSE; + } + } else if (is_domain (*inptr)) { + domain: + while (inptr < inend) { + if (!is_domain (*inptr)) + break; + + inptr++; + + while (inptr < inend && is_domain (*inptr)) + inptr++; + + if ((inptr + 1) < inend && *inptr == '.' && (is_domain (inptr[1]) || inptr[1] == '/')) + inptr++; + } + } else { + return FALSE; + } + + if (inptr < inend) { + switch (*inptr) { + case ':': /* we either have a port or a password */ + inptr++; + + if (is_digit (*inptr) || passwd) { + port = (*inptr++ - '0'); + + while (inptr < inend && is_digit (*inptr) && port < 65536) + port = (port * 10) + (*inptr++ - '0'); + + if (!passwd && (port >= 65536 || *inptr == '@')) { + if (inptr < inend) { + /* this must be a password? */ + goto passwd; + } + + inptr--; + } + } else { + passwd: + passwd = TRUE; + save = inptr; + + while (inptr < inend && is_atom (*inptr)) + inptr++; + + if ((inptr + 2) < inend) { + if (*inptr == '@') { + inptr++; + if (is_domain (*inptr)) + goto domain; + } + + return FALSE; + } + } + + if (inptr >= inend || *inptr != '/') + break; + + /* we have a '/' so there could be a path - fall through */ + case '/': /* we've detected a path component to our url */ + inptr++; + + while (inptr < inend && is_urlsafe (*inptr) && *inptr != close_brace) + inptr++; + + break; + default: + break; + } + } + + /* urls are extremely unlikely to end with any + * punctuation, so strip any trailing + * punctuation off. Also strip off any closing + * braces or quotes. */ + while (inptr > pos && strchr (",.:;?!-|)}]'\"", inptr[-1])) + inptr--; + + match->um_eo = (inptr - in); + + return TRUE; +} + + +#ifdef BUILD_TABLE + +#include + +/* got these from rfc1738 */ +#define CHARS_LWSP " \t\n\r" /* linear whitespace chars */ +#define CHARS_SPECIAL "()<>@,;:\\\".[]" + +/* got these from rfc1738 */ +#define CHARS_URLSAFE "$-_.+!*'(),{}|\\^~[]`#%\";/?:@&=" + + +static void +table_init_bits (unsigned int mask, const unsigned char *vals) +{ + int i; + + for (i = 0; vals[i] != '\0'; i++) + url_scanner_table[vals[i]] |= mask; +} + +static void +url_scanner_table_init (void) +{ + int i; + + for (i = 0; i < 256; i++) { + url_scanner_table[i] = 0; + if (i < 32) + url_scanner_table[i] |= IS_CTRL; + if ((i >= '0' && i <= '9')) + url_scanner_table[i] |= IS_DIGIT | IS_DOMAIN; + if ((i >= 'a' && i <= 'z') || (i >= 'A' && i <= 'Z')) + url_scanner_table[i] |= IS_ALPHA | IS_DOMAIN; + if (i >= 127) + url_scanner_table[i] |= IS_CTRL; + } + + url_scanner_table[' '] |= IS_SPACE; + url_scanner_table['-'] |= IS_DOMAIN; + + /* not defined to be special in rfc0822, but when scanning + backwards to find the beginning of the email address we do + not want to include this char if we come accross it - so + this is kind of a hack, but it's ok */ + url_scanner_table['/'] |= IS_SPECIAL; + + table_init_bits (IS_LWSP, CHARS_LWSP); + table_init_bits (IS_SPECIAL, CHARS_SPECIAL); + table_init_bits (IS_URLSAFE, CHARS_URLSAFE); +} + +int main (int argc, char **argv) +{ + int i; + + url_scanner_table_init (); + + printf ("static unsigned char url_scanner_table[256] = {"); + for (i = 0; i < 256; i++) { + printf ("%s%3d%s", (i % 16) ? "" : "\n\t", + url_scanner_table[i], i != 255 ? "," : "\n"); + } + printf ("};\n\n"); + + return 0; +} + +#endif /* BUILD_TABLE */ diff --git a/util/url-scanner.h b/util/url-scanner.h new file mode 100644 index 0000000..3d35728 --- /dev/null +++ b/util/url-scanner.h @@ -0,0 +1,65 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* GMime + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free + * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + + +#ifndef __URL_SCANNER_H__ +#define __URL_SCANNER_H__ + +#include +#include + +G_BEGIN_DECLS + +typedef struct { + const char *pattern; + const char *prefix; + size_t um_so; + size_t um_eo; +} urlmatch_t; + +typedef gboolean (*UrlScanFunc) (const char *in, const char *pos, const char *inend, urlmatch_t *match); + +/* some default GUrlScanFunc's */ +G_GNUC_INTERNAL gboolean url_file_start (const char *in, const char *pos, const char *inend, urlmatch_t *match); +G_GNUC_INTERNAL gboolean url_file_end (const char *in, const char *pos, const char *inend, urlmatch_t *match); +G_GNUC_INTERNAL gboolean url_web_start (const char *in, const char *pos, const char *inend, urlmatch_t *match); +G_GNUC_INTERNAL gboolean url_web_end (const char *in, const char *pos, const char *inend, urlmatch_t *match); +G_GNUC_INTERNAL gboolean url_addrspec_start (const char *in, const char *pos, const char *inend, urlmatch_t *match); +G_GNUC_INTERNAL gboolean url_addrspec_end (const char *in, const char *pos, const char *inend, urlmatch_t *match); + +typedef struct { + char *pattern; + char *prefix; + UrlScanFunc start; + UrlScanFunc end; +} urlpattern_t; + +typedef struct _UrlScanner UrlScanner; + +G_GNUC_INTERNAL UrlScanner *url_scanner_new (void); +G_GNUC_INTERNAL void url_scanner_free (UrlScanner *scanner); + +G_GNUC_INTERNAL void url_scanner_add (UrlScanner *scanner, urlpattern_t *pattern); + +G_GNUC_INTERNAL gboolean url_scanner_scan (UrlScanner *scanner, const char *in, size_t inlen, urlmatch_t *match); + +G_END_DECLS + +#endif /* __URL_SCANNER_H__ */ diff --git a/zentimer.h b/zentimer.h new file mode 100644 index 0000000..4bacd99 --- /dev/null +++ b/zentimer.h @@ -0,0 +1,189 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* ZenTimer + * Copyright (C) 2000-2012 Jeffrey Stedfast + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + + +#ifndef __ZENTIMER_H__ +#define __ZENTIMER_H__ + +#ifdef ENABLE_ZENTIMER + +#include +#ifdef WIN32 +#include +#else +#include +#endif +#ifdef HAVE_STDINT_H +#include +#elif HAVE_INTTYPES_H +#include +#else +typedef unsigned char uint8_t; +typedef unsigned long int uint32_t; +typedef unsigned long long uint64_t; +#endif + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define ZTIME_USEC_PER_SEC 1000000 + +/* ztime_t represents usec */ +typedef uint64_t ztime_t; + +#ifdef WIN32 +static uint64_t ztimer_freq = 0; +#endif + +static void +ztime (ztime_t *ztimep) +{ +#ifdef WIN32 + QueryPerformanceCounter ((LARGE_INTEGER *) ztimep); +#else + struct timeval tv; + + gettimeofday (&tv, NULL); + + *ztimep = ((uint64_t) tv.tv_sec * ZTIME_USEC_PER_SEC) + tv.tv_usec; +#endif +} + +enum { + ZTIMER_INACTIVE = 0, + ZTIMER_ACTIVE = (1 << 0), + ZTIMER_PAUSED = (1 << 1), +}; + +typedef struct { + ztime_t start; + ztime_t stop; + int state; +} ztimer_t; + +#define ZTIMER_INITIALIZER { 0, 0, 0 } + +/* default timer */ +static ztimer_t __ztimer = ZTIMER_INITIALIZER; + +static void +ZenTimerStart (ztimer_t *ztimer) +{ + ztimer = ztimer ? ztimer : &__ztimer; + + ztimer->state = ZTIMER_ACTIVE; + ztime (&ztimer->start); +} + +static void +ZenTimerStop (ztimer_t *ztimer) +{ + ztimer = ztimer ? ztimer : &__ztimer; + + ztime (&ztimer->stop); + ztimer->state = ZTIMER_INACTIVE; +} + +static void +ZenTimerPause (ztimer_t *ztimer) +{ + ztimer = ztimer ? ztimer : &__ztimer; + + ztime (&ztimer->stop); + ztimer->state |= ZTIMER_PAUSED; +} + +static void +ZenTimerResume (ztimer_t *ztimer) +{ + ztime_t now, delta; + + ztimer = ztimer ? ztimer : &__ztimer; + + /* unpause */ + ztimer->state &= ~ZTIMER_PAUSED; + + ztime (&now); + + /* calculate time since paused */ + delta = now - ztimer->stop; + + /* adjust start time to account for time elapsed since paused */ + ztimer->start += delta; +} + +static double +ZenTimerElapsed (ztimer_t *ztimer, uint64_t *usec) +{ +#ifdef WIN32 + static uint64_t freq = 0; + ztime_t delta, stop; + + if (freq == 0) + QueryPerformanceFrequency ((LARGE_INTEGER *) &freq); +#else + static uint64_t freq = ZTIME_USEC_PER_SEC; + ztime_t delta, stop; +#endif + + ztimer = ztimer ? ztimer : &__ztimer; + + if (ztimer->state != ZTIMER_ACTIVE) + stop = ztimer->stop; + else + ztime (&stop); + + delta = stop - ztimer->start; + + if (usec != NULL) + *usec = (uint64_t) (delta * ((double) ZTIME_USEC_PER_SEC / (double) freq)); + + return (double) delta / (double) freq; +} + +static void +ZenTimerReport (ztimer_t *ztimer, const char *oper) +{ + fprintf (stderr, "ZenTimer: %s took %.6f seconds\n", oper, ZenTimerElapsed (ztimer, NULL)); +} + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#else /* ! ENABLE_ZENTIMER */ + +#define ZenTimerStart(ztimerp) +#define ZenTimerStop(ztimerp) +#define ZenTimerPause(ztimerp) +#define ZenTimerResume(ztimerp) +#define ZenTimerElapsed(ztimerp, usec) +#define ZenTimerReport(ztimerp, oper) + +#endif /* ENABLE_ZENTIMER */ + +#endif /* __ZENTIMER_H__ */ -- 2.7.4